22

您将如何在 Rails 应用程序中按用户选择的日期范围生成报告?什么是最好的日期范围选择器?

响应 patrick 进行编辑:我正在寻找一些小部件和活动记录建议,但我真正好奇的是如何根据用户选择的日期从容地显示日期范围列表。

4

2 回答 2

32

我们是在这里问一个界面问题(即你想要一个小部件)还是一个 ActiveRecord 问题?

日期选择小部件

1) 默认 Rails 解决方案:请参阅此处date_select的文档。

2) 使用插件:为什么要写代码?我个人喜欢CalendarDateSelect插件,当我需要一个范围时使用一对吸盘。

3) 使 Javascript 小部件适应 Rails :将 Yahoo UI 库 (YUI) Calendar之类的东西(全是 Javascript)集成到 Rails 几乎是微不足道的。从 Rails 的角度来看,它只是填充params[:start_date]and的另一种方式params[:end_date]。YUI 日历具有对范围的原生支持。

从小部件中获取数据

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 做法。在您的索引操作中,您可以执行 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 回答