在我的Rails应用程序中,我有这个模型:
class Project < ActiveRecord::Base
attr_accessible :name, :person_ids
belongs_to :user
has_many :people_projects
has_many :people, :through => :people_projects
end
我不明白的是:
当我创建一个新项目时,为什么在person_ids
数组的开头总是有一个空元素:
Parameters: {"utf8" => "✓", "project" => {"name" => "Testproject", "person_ids" => ["", "1", "2", "3"]}, "commit" => "Create", "id"=>"77"}
这不仅发生在我的Project
课程中,也发生在所有其他has_many through
课程中,这会导致我很多(主要是与验证相关的)麻烦。
这是我的表格:
<div class="field">
<%= f.label "People" %>
<%= f.select(:person_ids, current_user.people.map { |p| [ p.name, p.id ] }, {}, {:multiple => true}) %>
</div>
感谢任何能够阐明这一点的人。
答案 0 :(得分:4)
我想也许我已经找到了这个问题。它似乎来自{:multiple => true}
Mike A.在this中的回答:
来自select
docs:
疑难杂症
HTML规范说当多个参数传递给select并且所有选项都被取消选择时,Web浏览器不会向服务器发送任何值。不幸的是,这引入了一个问题:如果用户模型具有许多角色并具有role_ids访问者,并且在编辑用户角色的形式中,用户从role_ids多选框中取消选择所有角色,则不会发送role_ids参数。所以,任何像
这样的质量分配习语
@user.update_attributes(params[:user])
不会更新角色。
为了防止这种情况,帮助者在每次多次选择之前生成辅助隐藏字段。隐藏字段与多个选择和空白值具有相同的名称。
这样,客户端只发送隐藏字段(表示取消选择的多个选择框)或两个字段。由于HTML规范说键/值对必须以它们在表单中出现的相同顺序发送,并且参数提取得到查询字符串中任何重复键的最后一次出现,这适用于普通表单。
所以这是一个有意义的计划功能,但它可能有一个黑暗的一面(如你的情况) - 显然这在Rails 4中被改变,根据来自相同链接问题的this answer。
您将能够通过
:include_hidden
选项。 https://github.com/rails/rails/pull/5414/files
同一篇文章提供了此解决方案,它删除了模型级别的所有空白值:
before_validation do |model|
model.subset_array.reject!(&:blank?) if model.subset_array
end