具有multipe true的collection_select使用空字符串发送params

时间:2015-10-19 17:35:14

标签: ruby-on-rails

我的应用程序中的select_options标记生成一个参数列表,该列表在开头总是包含一个空字符串。 当params用于从数据库中获取数据时,这会导致错误。

表单部分是这样的:

<%= f.label :text %><br>
<%= f.text_area :text, cols: 80, rows: 15, class: 'form-control' %>


<%= f.label 'Category:' %>

<%= f.collection_select(:categories, Category.all, :id, :cat_name, {:selected => Category.first.id}, {:multiple => true}) %>

输出(html)是这样的:

<select multiple="multiple" name="article[categories][]" id="article_categories">
  <input name="article[categories][]" value="" type="hidden">
  <option selected="selected" value="1">default</option>
  <option value="2">politics</option>
</select>

对我来说这看起来很完美。但是在提交时(选择了两个选项)参数如下所示:

Parameters: {"utf8"=>"✓", "authenticity_token"=>"kvYo6rb+lswUuJMHpbb+hH3YFjHU25/ESN7vvLLdlVn1TOSgzyiMsXkrJbiWIhuuO4UvNLQ3jU7uTw0zneVTUA==", 
"article"=>{"title"=>"test category", "text"=>"Na mal sehen...\r\nIses drin?", 
"categories"=>["", "1", "2"], "published"=>"0"}, "commit"=>"Save changes", "id"=>"76"}

类别部分包含:类别“=&gt; [”“,”1“,”2“] 第一个是空字符串,我无法弄清楚如何摆脱它。

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

Rails生成一个隐藏字段,该字段与select字段具有相同的名称,因此如果未选择任何选项,则仍会提交值。您可以通过为collection_select指定include_hidden: false来阻止Rails添加隐藏字段。

以下是解释(link)的摘录:

  

为了防止这种情况,帮助者之前生成一个辅助隐藏字段   每一个选择。隐藏字段与多个字段同名   选择和空白值。

     

注意:客户端要么只发送隐藏字段(代表   取消选择多个选择框)或两个字段。这意味着   结果数组始终包含空字符串。

     

如果您不希望帮助程序生成此隐藏字段,请执行   可以指定include_hidden:false选项。

答案 1 :(得分:0)

向导的解决方案有一些负面影响:我们设置后无法清空字段。 我发现我们可以配置如下的强参数来解决问题:

params.require(:article).permit(categories: []);

我发现permit(:categories) 无效permit(categories: []) 有效