我的应用程序中的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“] 第一个是空字符串,我无法弄清楚如何摆脱它。
提前感谢您的帮助!
答案 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: [])
有效。