Rails插件 - 来自二进制逻辑的Searchlogic - 提供按日期过滤的功能。我的表单设置如此...
<% form_for @search do |f| %>
<%= f.label :start %> <%= f.select :due_at_after, [[['','']],['November', '2009-11-01'.to_date],['December', '2009-12-01'.to_date]] %><br>
<%= f.label :end %> <%= f.select :due_at_before, [[['','']],['December', '2009-12-01'.to_date],['January', '2010-01-01'.to_date]] %>
<%= f.submit 'Search' %>
<% end %>
但是,我从控制器中生成的@search对象返回的日期......
@search = Task.with_member(current_user).search(params[:search])
正在生成一个类似于此
的日期参数{:due_at_after=>Sat, 31 Oct 2009 20:00:00 EDT -04:00}
使用这两种格式,表单不会显示所选的下拉列表。看起来searchlogic对象中的格式也使用了时区调整时间。
有关如何处理此问题的任何想法?
答案 0 :(得分:1)
您的问题很大一部分似乎正在发生,因为您正在将字符串转换为日期,并追溯到字符串。我相信你可能会比你需要的更多。
HTML表单并不真正“理解”日期 - 它们只是“理解”字符串。所以可以传递它们的字符串而不是日期。换句话说,可以删除to_date
。
<% form_for @search do |f| %>
<%= f.label :start %>
<%= f.select :due_at_after,
['November', '2009-11-01'],['December', '2009-12-01']],
:include_blank => true
%>
<br/>
<%= f.label :end %>
<%= f.select :due_at_before,
[['December', '2009-12-01'],['January', '2010-01-01']],
:include_blank => true
%>
<%= f.submit 'Search' %>
<% end %>
此外,我更喜欢使用:include_blank => true
而不是[['','']]
(在我看来更易于阅读),我使用了一个封闭的<br/>
标记(标准的html内容 - 也许你做的一个错字?)。
顺便说一句,如果要指定Date,可以使用Date构造函数。写入和执行速度比创建字符串和解析日期更快。
#Date(2009,11,1) is faster, shorter, and equivalent
Date(2009,11,1) == '2009-11-01'.to_date # --> true
答案 1 :(得分:0)
您是否希望查找特定月份的记录?查看我的by_star gem /插件。