我正在使用Ransack在名为Car
的模型上创建搜索表单。我在Car
上有几个布尔属性,我在每个搜索表单中都包含了复选框,例如:
<%= f.check_box :car_spec_anti_lock_brakes_true %>
<%= f.label :car_spec_anti_lock_brakes_true, "ABS" %>
选中此复选框后,搜索结果将包含car_spec_anti_lock_brakes
为true
的所有记录。如果未选中此选项,则结果仅返回car_spec_anti_lock_brakes
为false
的记录。如何实现搜索表单,以便在未选中复选框时返回car_spec_anti_lock_brakes
为true或false的所有记录。因此,当选中该复选框时,将返回具有该属性的所有记录,但在取消选中时,将返回所有记录,而不管该属性是true还是false。
答案 0 :(得分:6)
我通过编辑视图文件解决了。
您的代码会生成提供虚假参数的隐藏表单。
<%= f.check_box :car_spec_anti_lock_brakes_true %>
#generated html code
<input type="hidden" value="0" name="q[car_spec_anti_lock_brakes_true]"></input>
<input id="q_car_spec_anti_lock_brakes_true" type="checkbox" value="1" name="q[car_spec_anti_lock_brakes_true]"></input>
所以,我删除了隐藏的表单。
<%= f.check_box :car_spec_anti_lock_brakes_true, include_hidden: false %>
#generated html code
<input id="q_car_spec_anti_lock_brakes_true" name="q[car_spec_anti_lock_brakes_true]" value="1" type="checkbox"></input>
如果未选中此复选框,则会返回car_spec_anti_lock_brakes
为true或false的所有记录。
答案 1 :(得分:0)
我通过编辑传递给params
方法的Car.search
哈希解决了这个问题。如果未选中复选框,我会从散列中删除参数。如果我有以下复选框:
<%= f.check_box :car_spec_anti_lock_brakes_true %>
<%= f.label :car_spec_anti_lock_brakes_true, "ABS" %>
<%= f.check_box :car_spec_traction_control_true %>
<%= f.label :car_spec_traction_control_true, "Traction control" %>
<%= f.check_box :car_spec_rims_true %>
<%= f.label :car_spec_rims_true, "Rims" %>
params[:q]
哈希将包含密钥:car_spec_anti_lock_brakes_true
,:car_spec_traction_control_true
,:car_spec_rims_true
。如果未选中复选框,则相应的键在传递到搜索中时,0
哈希值中的值为params[:q]
。解决方案是在传递到搜索之前从0
哈希中删除具有params[:q]
值的密钥:
if params[:q]
@params = params[:q]
@params.delete(:car_spec_anti_lock_brakes_true) if @params[:car_spec_anti_lock_brakes_true] = '0'
@params.delete(:car_spec_traction_control_true) if @params[:car_spec_traction_control_true] = '0'
@params.delete(:car_spec_anti_rims_true) if @params[:car_spec_rims_true] = '0'
else
@params = []
end
@search = Car.search(@params)
@cars = @search.result