演習3解答例¶
作業手順¶
ruby script/generate model user name:string user_id:integer
ruby script/generate migration AddUserIdToTodo user_id:integer
rake db:migrate
ruby script/console # usersデータの作成,todos.user_id更新
User.new(:id=>1, :name=>'山田')
u.save
u = User.new(:id=>2, :name=>'川田')
u.save
Todo.update_all("user_id=1")
User.find(:all) # users の確認
Todo.find(:all) # todos の確認
quit
変更点¶
1. app/models/user.rb¶
Todoとの一対多の関連を記述
1 class User < ActiveRecord::Base
2 ##(has_many :todos)##
3 end
2. app/models/todo.rb¶
Userとの多対一の関連(従属)を記述
1 class Todo < ActiveRecord::Base
2 ##(belongs_to :user)##
3 end
3. app/views/todos/index.html.erb¶
user.nameカラム表示用のコードを追加
1 <h1>Listing todos</h1>
2
3 <table>
4 <tr>
5 <th>Due</th>
6 ##(<th>Name</th>)##
7 <th>Task</th>
8 </tr>
9
10 <% for todo in @todos %>
11 <tr>
12 <td><%=h todo.due %></td>
13 ##(<td><%=h todo.user.name %></td>)##
14 <td><%=h todo.task %></td>
15 <td><%= link_to 'Show', todo %></td>
16 <td><%= link_to 'Edit', edit_todo_path(todo) %></td>
17 <td><%= link_to 'Destroy', todo, :confirm => 'Are you sure?', :method => :delete %></td>
18 </tr>
19 <% end %>
20 </table>
21
22 <br />
23
24 <%= link_to 'New todo', new_todo_path %>
4. app/views/todos/show.html.erb¶
user.nameカラム表示用のコードを追加
1 <p>
2 <b>Due:</b>
3 <%=h @todo.due %>
4 </p>
5
6 <p>
7 <b>Task:</b>
8 <%=h @todo.task %>
9 </p>
10
11 ##(<p>
12 <b>Name:</b>
13 <%=h @todo.user.name %>
14 </p>)##
15
16 <p>
17 <b>Memo:</b><br/>
18 <%=new_line(h(@todo.memo)) %>
19 </p>
20
21 <%= link_to 'Edit', edit_todo_path(@todo) %> |
22 <%= link_to 'Back', todos_path %>
5. app/views/todos/edit.html.erb¶
user.name入力表示用のコードを追加
1 <h1>Editing todo</h1>
2
3 <%= error_messages_for :todo %>
4
5 <% form_for(@todo) do |f| %>
6 <p>
7 <b>Due</b><br />
8 <%= f.date_select :due %>
9 </p>
10
11 <p>
12 <b>Task</b><br />
13 <%= f.text_field :task %>
14 </p>
15
16 ##(<p>
17 <b>Name</b><br />
18 <%= f.select :user_id, User.find(:all).collect {|u| [ u.name, u.id ] } %>
19 </p>)##
20
21 <p>
22 <b>Memo</b><br />
23 <%= f.text_area :memo %>
24 </p>
25
26 <p>
27 <%= f.submit "Update" %>
28 </p>
29 <% end %>
30
31 <%= link_to 'Show', @todo %> |
32 <%= link_to 'Back', todos_path %>
6. app/views/todos/new.html.erb¶
user.name入力表示用のコードを追加
1 <h1>New todo</h1>
2
3 <%= error_messages_for :todo %>
4
5 <% form_for(@todo) do |f| %>
6 <p>
7 <b>Due</b><br />
8 <%= f.date_select :due %>
9 </p>
10
11 <p>
12 <b>Task</b><br />
13 <%= f.text_field :task %>
14 </p>
15
16 ##(<p>
17 <b>Name</b><br />
18 <%= f.select :user_id, User.find(:all).collect {|u| [ u.name, u.id ] } %>
19 </p>)##
20
21 <p>
22 <b>Memo</b><br />
23 <%= f.text_area :memo %>
24 </p>
25
26 <p>
27 <%= f.submit "Create" %>
28 </p>
29 <% end %>
30
31 <%= link_to 'Back', todos_path %>
ソースコード ¶
解答例のソースコードは http://ey-office.net/redmine/repositories/browse/rails/tags/todo_q3 で参照できます。
Also available in:
HTML
TXT