Rails入門 日程調整アプリを作ろう5
Rails入門 日程調整アプリを作ろう4の続き。
実装 -2-(Schedule,UserSchedule)の11-15です。
11.UserScheduleのコントローラーを作成する(日程調整画面)
11-1.Eclipseのジェネレータータブを開き、プルダウンにcontroller、テキストボックスにuser_schedule listを入力し、実行ボタンをクリックします。
12.UserSchedule/listへのlinkをEvent/listに新たに作成
12-1./adjuster/app/views/event/list.rhtmlを開き、table部分を以下のように記述します。
<table> <tr> <% for column in Event.content_columns %> <th><%= column.human_name %></th> <% end %> </tr> <% for event in @events %> <tr> <% for column in Event.content_columns %> <td><%=h event.send(column.name) %></td> <% end %> <td><%= link_to 'Show', :action => 'show', :id => event %></td> <td><%= link_to 'Edit', :action => 'edit', :id => event %></td> <td><%= link_to 'Destroy', { :action => 'destroy', :id => event }, :confirm => 'Are you sure?', :method => :post %></td> <td><%= link_to 'Schedule_list', :controller => 'schedule', :action => 'list', :id => event %></td> <td><%= link_to 'attend', :controller => 'user_schedule', :action => 'list', :id => event %></td> </tr> <% end %> </table>
13.UserScheduleコントローラーのlistにマトリックス表示に必要な処理を記述
13-1./adjuster/app/controllers/user_schedule_controller.rbを編集します。
<table> class UserScheduleController < ApplicationController def list @event = Event.find(params[:id]) @schedules = @event.schedules @users = User.find(:all, :include => [:user_schedules, :schedules], :conditions => ["schedules.event_id = ?", @event.id]) end end
この時点では、@usersを取得するところにミスがあるそうです。
14.UserScheduleのviews/list.rhtmlに、マトリックス表表示の処理を記述
14-1./adjuster/app/views/user_schedule/list.rhtmlを修正します。
<h1><%=h @event.name %> UserSchedule#list</h1> <table> <tr> <th>Name</th> <% for schedule in @schedules %> <th><%=h schedule.schedule_date.strftime("%m/%d") %></th> <% end %> </tr> <% for user in @users %> <tr> <td><%=h user.name %></td> <% for user_schedule in user.user_schedules %> <td><%=h user_schedule.attend %></td> <% end %> </tr> <% end %> </table>
15.User,Schedule作成時、UserScheduleを作成する処理を記述
15-1./adjuster/app/models/user.rbを編集します。
class User < ActiveRecord::Base has_many :user_schedules, :dependent => :destroy has_many :schedules, :through => :user_schedules after_create :create_user_schedule def create_user_schedule Schedule.find(:all, :conditions => ["schedule_date >= ?", Time.now.beginning_of_month]).each do |schedule| self.schedules << schedule end end end
:dependent => :destroyで、userをdestroyした時にuser_schedulesもdestroyされるようになります。
self.schedules << scheduleがなぁ、いまいちわからない。。
15-2./adjuster/app/models/schedule.rbを編集します。
class Schedule < ActiveRecord::Base belongs_to :event has_many :user_schedules, :dependent => :destroy has_many :users, :through => :user_schedules after_create :create_user_schedule def create_user_schedule User.find(:all).each do |user| self.users << user end end end
15-3.既に登録されている情報を全て削除し、Event、User、Scheduleを入れなおします。
とりあえず日程調整画面の表示まできました。