【问题标题】:Ransack return records with boolean attribute both true and false with checkbox带有布尔属性的 Ransack 返回记录,带有复选框的 true 和 false
【发布时间】:2015-01-11 19:12:09
【问题描述】:

我正在使用 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 为真或假的记录。所以当复选框被选中时返回所有具有该属性的记录,但是当它未被选中时返回所有记录,与属性是真还是假无关。

【问题讨论】:

    标签: ruby-on-rails ransack


    【解决方案1】:

    我通过编辑视图文件解决了。

    您的代码生成提供虚假参数的隐藏表单。

    <%= 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 为真或假的记录。

    【讨论】:

      【解决方案2】:

      我通过编辑传递给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 的值。解决方案是在将具有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
      

      【讨论】:

        猜你喜欢
        • 2012-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多