为什么我的person_ids哈希中有一个空数组元素?

时间:2013-11-02 18:54:38

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord

在我的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>

感谢任何能够阐明这一点的人。

1 个答案:

答案 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