演習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