2010年10月10日日曜日

日報アプリ・月表示(第1歩)

家人が具合を悪くして病院に連れて行ったり、そのため家事をするはめになったりで、あまり作業進まず。仕方ないや。

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を代えたほうがリーズナブル、と考えた。

  1. calendar/2010/10/10=>その日のイベントを表示するshow_date
  2. calendar/2010/10=>イベントを月ごとに表にして表示するshow_month
  3. calendar/2010=>いわゆるスクールカレンダーを表示するshow_year
  4. 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 件のコメント:

コメントを投稿