Ransack使用复选框返回布尔属性为true和false的记录

时间:2015-01-11 19:12:10

标签: ruby-on-rails ransack

我正在使用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_brakestrue的所有记录。如果未选中此选项,则结果仅返回car_spec_anti_lock_brakesfalse的记录。如何实现搜索表单,以便在未选中复选框时返回car_spec_anti_lock_brakes为true或false的所有记录。因此,当选中该复选框时,将返回具有该属性的所有记录,但在取消选中时,将返回所有记录,而不管该属性是true还是false。

2 个答案:

答案 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