Railsアプリでユーザーが選択した日付範囲ごとにレポートを作成するにはどうすればよいですか? 最高の日付範囲ピッカーは何ですか?
patrick に応じて編集: ウィジェットとアクティブ レコードの両方のアドバイスを少し探していますが、本当に興味があるのは、ユーザーが選択した日付に基づいて日付範囲リストを表示する方法です。
Railsアプリでユーザーが選択した日付範囲ごとにレポートを作成するにはどうすればよいですか? 最高の日付範囲ピッカーは何ですか?
patrick に応じて編集: ウィジェットとアクティブ レコードの両方のアドバイスを少し探していますが、本当に興味があるのは、ユーザーが選択した日付に基づいて日付範囲リストを表示する方法です。
ここでインターフェースの質問をしていますか (つまり、ウィジェットが必要ですか)、それとも ActiveRecord の質問ですか?
1) デフォルトの Rails ソリューション: こちらのdate_select
ドキュメントを参照してください。
2) プラグインを使う: なぜコードを書くのか? 個人的には、CalendarDateSelectプラグインが好きで、範囲が必要なときに吸盤のペアを使用します。
3) Javascript ウィジェットを Rails に適応させる:すべて Javascript であるYahoo UI ライブラリ (YUI) Calendarのようなものを Rails に統合するのはほとんど簡単です。params[:start_date]
Rails の観点からは、 andを設定するもう 1 つの方法にすぎませんparams[:end_date]
。YUI Calendar は、範囲をネイティブでサポートしています。
1) デフォルトの Rails ソリューション こちらdate_select
のドキュメントを参照してください。
#an application helper method you'll find helpful
#credit to http://blog.zerosum.org/2007/5/9/deconstructing-date_select
# Reconstruct a date object from date_select helper form params
def build_date_from_params(field_name, params)
Date.new(params["#{field_name.to_s}(1i)"].to_i,
params["#{field_name.to_s}(2i)"].to_i,
params["#{field_name.to_s}(3i)"].to_i)
end
#goes into view
<%= date_select "report", "start_date", ... %>
<%= date_select "report", "end_date", ... %>
#goes into controller -- add your own error handling/defaults, please!
report_start_date = build_date_from_params("start_date", params[:report])
report_end_date = build_date_from_params("end_date", params[:report])
2) CalendarDateSelect : 上記と似ていますが、より魅力的な UI が表示されています。
3) Javascript ウィジェットを適応させる: 通常、これは、一部のフォーム要素が日付入力を文字列として持つことを意味します。Date.parse は深刻な魔法なので、あなたにとって朗報です。params[:some_form_element_name] は Rails によって初期化されます。
#goes in controller. Please handle errors yourself -- Javascript != trusted input.
report_start_date = Date.parse(params[:report_start_date])
やさしい。
#initialize start_date and end_date up here, by pulling from params probably
@models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?',
start_date, end_date])
#do something with models
選択したレコードの範囲を URL パラメーターで制御することは、非 RESTful な方法ではありません。index アクションでは、Patrick が提案したことを実行して、次のようにすることができます。
#initialize start_date and end_date up here, by pulling from params probably
@models = SomeModel.find(:all, :conditions => ['date >= ? and date <= ?', params[:start_date], params[:end_date]])
次に、インデックス ビューで、?start_date=2008-01-01&end_date=2008-12-31 を URL に追加するフォームを作成します。これはユーザー提供の入力であることを忘れないでください。index アクションで画面に戻す場合は、次のようにしてください。
Showing records starting on
<%= h start_date %>
and ending on
<%= h end_date %>