dbに保存されているeventを、月別に表示する作業。
routes.rbは結局
match '/calendar/:year/:month/:day' => 'calendars#show_date',:year=>/(19|20)\d\d/,:month=>/[01]?\d/,:day=>/[0-3]?\d/
match '/calendar/:year/:month' => 'calendars#show_month',:year=>/(19|20)\d\d/,:month=>/[01]?\d/
match '/calendar/:year/:month/:week' => 'calendars#show_week',:year=>/(19|20)\d\d/,:month=>/[01]?\d/,:week=>/(1st|2nd|3rd|4th|5th)/
match '/calendar/:year' => 'calendars#show_year',:year=>/(19|20)\d\d/
と書き換えた。controller側でredirectするような処理をするなら、URLのリクエストでactionを代えたほうがリーズナブル、と考えた。
- calendar/2010/10/10=>その日のイベントを表示するshow_date
- calendar/2010/10=>イベントを月ごとに表にして表示するshow_month
- calendar/2010=>いわゆるスクールカレンダーを表示するshow_year
- calendar/2010/10/1st=>10月第1週を表示するshow_week
という感じ。controllerのaction「show_month」だけつくり始めた。
def show_month
last_day=Time.days_in_month(params[:month].to_i) #表示する月の日数を求める
start_date=Date::new(params[:year].to_i,params[:month].to_i,1) #検索用=>"2010-4-1"
end_date=Date::new(params[:year].to_i,params[:month].to_i,last_day) #=>"2010-4-31"
#検索する
@events=Event.where(["start_at >=? AND start_at <=?",start_date,end_date])
end
dbの検索は
@events=Event.where(["start_at >=? AND start_at <=?",start_date,end_date])
とシンプルに書けることがわかった。本日の収穫。
viewは今のところただイベントを表示しているだけ。
<% @events.each do |event| %>
< table>
< tr>
< td><%= event.name %></td>
< td><%= event.start_at %></td>
< td><%= event.end_at %></td>
</tr>
<% end %>
</table>
で、実行するとこうなる。
0 件のコメント:
コメントを投稿