Ransack return 具有布尔属性的记录,包括 true 和 false 以及复选框
Ransack return records with boolean attribute both true and false with checkbox
我正在使用 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
的所有记录。未选中时,结果仅 return 记录其中 car_spec_anti_lock_brakes
为 false
。我如何实现搜索表单,以便在未选中复选框时,car_spec_anti_lock_brakes
为真或假的所有记录都被 returned。因此,当复选框被选中时 return 所有具有该属性的记录,但当它未被选中时 return 所有记录,与属性是真还是假无关。
我通过编辑传递给 Car.search
方法的 params
散列解决了这个问题。如果未选中该复选框,我会从散列中删除参数。所以如果我有以下复选框:
<%= 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
。当一个复选框未被选中时,相应的键在被传递到搜索时将在 params[:q]
散列中具有 0
的值。解决方案是在 params[:q]
散列中删除具有 0
值的键,然后再将它们传递到搜索中:
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
我通过编辑视图文件解决了。
您的代码生成提供虚假参数的隐藏表单。
<%= 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 的记录。
我正在使用 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
的所有记录。未选中时,结果仅 return 记录其中 car_spec_anti_lock_brakes
为 false
。我如何实现搜索表单,以便在未选中复选框时,car_spec_anti_lock_brakes
为真或假的所有记录都被 returned。因此,当复选框被选中时 return 所有具有该属性的记录,但当它未被选中时 return 所有记录,与属性是真还是假无关。
我通过编辑传递给 Car.search
方法的 params
散列解决了这个问题。如果未选中该复选框,我会从散列中删除参数。所以如果我有以下复选框:
<%= 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
。当一个复选框未被选中时,相应的键在被传递到搜索时将在 params[:q]
散列中具有 0
的值。解决方案是在 params[:q]
散列中删除具有 0
值的键,然后再将它们传递到搜索中:
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
我通过编辑视图文件解决了。
您的代码生成提供虚假参数的隐藏表单。
<%= 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 的记录。