5

したがって、週ごとのカレンダービューがあり、開始日として/:year /:month /:dayを受け入れるようにルートが設定されています。

  match "events/(:year/:month/:day)" => "events#index", 
      :constraints => { :year => /\d{4}/, :month => /\d{2}/, :day => /\d{2}/ },
      :as => "events_date"

このルートの使用に関して2つの質問があります。まず、パラメータを解析するとき、これは私がしていることです:

unless params[:year].nil? || params[:month].nil? || params[:day].nil?
  start_date = Date.new(params[:year].to_i, params[:month].to_i, params[:day].to_i)
end
start_date = start_date.nil? ? Date.today : start_date

これはかなり冗長で醜いものだと私は思います。もっと良い方法はありますか?

そして、カレンダーの別の週へのリンクを作成するとき(週ごとのページング用)、次のようなことをする必要がありますか?

#assume an date object with the desired start date
link_to events_date_path(date.strftime('%Y'), date.strftime('%m'), date.strftime('%d'))

これも一種の冗長で醜いようです。ルートの日付を処理するための最良の方法は何ですか?

4

1 に答える 1

8

私の提案は、3つの別々の変数を使用しないことです。そうすれば、コントローラーで多くの余分なnullチェックと健全性チェックが発生することはありません。制約をそのままにして、マッチを次のようなものに変えることができます。

match "events/(:date)" => "events#index", 
      :constraints => { :date => /\d{4}-\d{2}-\d{2}/ },
      :as => "events_date"

したがって、コントローラーにはもう少し正気なものができあがります。

unless params[:date]
  start_date = params[:date].strftime("%Y-%m-%d').to_date # assuming you want a Date
end

そして、私は通常、これらのタイプの「これが設定されている場合」は、もう少し読みやすいと思うので、次のようなチェックを行います。

start_date = Date.today unless defined? start_date

最後の2つを一緒にロールすることもできます。

start_date = defined?(params[:date]) ? params[:date].strftime("%Y-%m-%d').to_date : Date.today
于 2012-05-02T20:57:40.430 に答える