Rails - 按日期范围筛选

3
尝试创建筛选器选择器以查找在给定日期范围内的课程日期的时间表:
AdminController:
def find_schedules
  if params[:start_date] && params[:end_date]
   start_date = params[:start_date]
   end_date = params[:end_date]
   @schedules = Schedule.find(:all, :conditions => {:coursedate => start_date..end_date})
  redirect_to :action => 'find_results'  
  end
end

查找日程视图:

<% form_tag(find_schedules_path) do %>
<%= select_date Date.today, :prefix => :start_date %>
<%= select_date Date.today, :prefix => :end_date %>>
<%= submit_tag "Submit", :disable_with => "Submitting..." %>
<% end %>

错误:

    Processing AdminController#find_schedules (for ...) [POST]
  Parameters: {"start_date"=>{"month"=>"3", "day"=>"23", "year"=>"2011"}, "commit"=>"Submit", "authenticity_token"=>"...", "end_date"=>{"month"=>"2", "day"=>"16", "year"=>"2012"}}

ArgumentError (bad value for range)

我似乎总是在日期/时间方面遇到麻烦。coursedate是日程表中的datetime字段,如果这有什么区别的话。我只需要搜索日期,而不是时间。因为mysql存储方式的原因,我需要转换数据类型吗?还是……我做错了什么?感谢您提前的帮助。
在bdon的帮助下,我已经接近成功了,非常感谢!现在我遇到了一个未定义的方法错误,但我应该能够解决它:
ActionView::TemplateError (undefined method `each' for nil:NilClass) on line #26 of /admin/find_results.html.erb:       
25: <tr class="<%= cycle('odd', 'even') %>">
26: <% @schedules.each do |schedule| %>
1个回答

4
您会看到这个错误是因为“range”函数不支持哈希表,在这种情况下被传递了哈希表:
1.9.3-p0 :008 > {:year => 2012, :month => 11, :day => 1}..{:year => 2012, :month => 12, :day => 1}
ArgumentError: bad value for range

相反,您需要将范围的开始和结束设置为DateTime对象:

1.9.3-p0 :010 > DateTime.new(2012,11,1)..DateTime.new(2012,12,1)
=> Thu, 01 Nov 2012 00:00:00 +0000..Sat, 01 Dec 2012 00:00:00 +0000 

所以
start_params = params[:start_date]
start_date = DateTime.new(start_params["year"].to_i, start_params["month"].to_i, start_params["day"].to_i)

请对end_date执行相同的操作。

非常感谢您的回复。日期时间CRUD真的让我困惑。我尝试了您的修复方法,但出现了以下错误:ArgumentError(将String与0进行比较失败)。我还尝试了以下代码:start_date = params[:start_date].values_at(:month, :day, :year)...您有什么想法吗? 再次感谢。 :) - Katie M
你需要使用 to_i 将每个参数从字符串转换为整数。 - bdon
越来越接近了,谢谢...现在又出现了另一个错误,但我应该能够解决它。 :) - Katie M
ActionView::TemplateError(未定义方法“each”的nil:NilClass)位于/admin/find_results.html.erb的第26行: 26:<% @schedules.each do |schedule| %> - Katie M
在您的查找结果控制器操作中,您需要类似于 @schedules = Schedule.find(:all, :conditions => ...) 的内容。如果它没有找到任何匹配项,它将返回一个空数组。由于您得到的是 nil 而不是空数组,所以您必须做一些其他的事情。 - bdon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接