22

Railsアプリでユーザーが選択した日付範囲ごとにレポートを作成するにはどうすればよいですか? 最高の日付範囲ピッカーは何ですか?

patrick に応じて編集: ウィジェットとアクティブ レコードの両方のアドバイスを少し探していますが、本当に興味があるのは、ユーザーが選択した日付に基づいて日付範囲リストを表示する方法です。

4

2 に答える 2

32

ここでインターフェースの質問をしていますか (つまり、ウィジェットが必要ですか)、それとも 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])

ActiveRecord への呼び出しを書く

やさしい。

  #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
于 2008-09-26T11:14:41.210 に答える
2

選択したレコードの範囲を 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 %>
于 2008-09-26T16:37:05.777 に答える