按日期范围生成报告
我们将如何在Rails应用中按用户选择的日期范围生成报告?什么是最佳日期范围选择器?
编辑以响应patrick:我正在寻找一些小部件和活动记录建议,但我真正想知道的是如何根据用户选择的日期充分显示日期范围列表。
解决方案
我们是在这里询问界面问题(即我们想要一个小部件)还是ActiveRecord问题?
1)默认的Rails解决方案:请参阅此处的" date_select"文档。
2)使用插件:为什么要编写代码?我个人喜欢CalendarDateSelect插件,在需要范围时使用一对吸盘。
3)使Javascript小部件适应Rails:将类似于Java的Yahoo UI库(YUI)Calendar之类的东西集成到Rails中几乎是微不足道的。从Rails的角度来看,这是填充params [:start_date]和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是一些不可思议的魔术。 Rails将为我们初始化params [:some_form_element_name]。
#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的做法。在索引操作中,我们可以执行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]])
然后,在索引视图中,创建一个将URL添加到?start_date = 2008-01-01&end_date = 2008-12-31的表单。请记住,它是用户提供的输入,因此请小心使用。如果我们将它放回索引操作中的屏幕上,请确保按以下方式进行操作:
Showing records starting on <%= h start_date %> and ending on <%= h end_date %>