Rails - 通过参数传递多个复选框值

时间:2016-04-19 21:08:22

标签: ruby-on-rails checkbox simple-form params

我正在使用Smart listing gem进行实时过滤。 以下是没有提交和网址的简单表单。

<%= smart_listing_controls_for(:search) do %>
  <%= simple_form_for :search do |f| %>
    <%= f.input :certificates, collection: Certificate.all, :as => :check_boxes, include_hidden: false, :input_html => {:multiple => true} %>
  <% end>
<% end>

以上代码生成多个复选框,其中“证书ID”为值。 一旦检查了其中一个复选框,智能列表就会向控制器发送带有参数的请求。

Parameters: {"utf8"=>"✓", "search_smart_listing"=>{"_"=>"1", "page"=>"", "per_page"=>"10"}, "authenticity_token"=>"z25rULU5JeeWcEZdpsy0+bz7OJFDWPmXrVGnzPvdG0cjM0ufpc3ydB9+5GywDQkUmcm6RGJnF0C4Yrd0sWpJ6g==", "search"=>{ "certificates"=>["6"]}}

问题是当我选择多个复选框时,证书数组只有最新值而不是所有选中的复选框值。

此外,当选中并取消选中复选框时,参数中的证书数组值保持不变。如果取消选中复选框并且只希望证书数组只包含所有选中的复选框值,我希望从参数中的证书数组中删除该值。

以下是为多个复选框之一生成的html代码。

<span class="checkbox">
  <label for="search_certificates_5">
    <input class="check_boxes required" type="checkbox" value="5" name="search[certificates][]" id="search_certificates_5">
     Certificate 1
  </label>
</span>

提前致谢:)

1 个答案:

答案 0 :(得分:3)

由于smart_listing_controls_forsimple_form_for都会创建表单,因此您可能遇到的一个问题是您在表单中创建了一个表单,这也不是建议的也不是标准的。这可能会导致意想不到的结果。

也许尝试在没有 simple_form 帮助器的情况下尝试这样做(假设Certificate具有描述属性):

<%= smart_listing_controls_for(:search) do %>
  <%= Certificate.all.each do |certificate| %>
    <div class="checkbox">
      <label class= "checkbox inline">
        <%= check_box_tag 'search[certificates][]', certificate.id %>
        <%= certificate.description %>
      </label>
    </div>
  <% end %>
<% end %>

<强>更新

此外,智能列表 gem的当前版本( v1.1.2 )存在问题,该版本不允许使用数组输入。问题出在javascript code的这一部分。这已在当前主分支上修复,并且最近在最新提交时更新,您可以看到here

要解决此问题,请使用 Gemfile 中的最新提交,如下所示:

gem 'smart_listing', :git => 'https://github.com/Sology/smart_listing.git', :ref => '79adeba'
更新 Gemfile

bundle install并再次尝试上述代码。