具有复选框的嵌套对象 - 即使使用accepts_nested_attributes_for进行质量分配?

时间:2009-04-07 19:42:21

标签: ruby-on-rails activerecord associations actionview

我认为应该有一个简单的解决方案,因为Rails 2.3具有这种新奇的嵌套表单功能。基本上我想创建或更新用户并同时为他们分配角色。

看起来我正在做的一切正确,但我收到错误警告:无法批量分配这些受保护的属性:roles_attrributes

我甚至尝试将视图更改为用户[permissions_attrributes] [role_id],因为我认为联接表可能会让Rails感到困惑。

无论如何,关于这应该如何实际工作的任何建议?

模型

class User < ActiveRecord::Base

  has_many :permissions
  has_many :roles, :through => :permissions

  accepts_nested_attributes_for :roles
  accepts_nested_attributes_for :permissions
end

从视图中摘录(注意我尝试过但无法获取fields_for以生成我想要的内容,也许这是我的问题?)

<% for role in Role.all %>
 <%= check_box_tag( "user[roles_attrributes][id]",role.id) %>
 <%= role.rolename %>
 <br/>
<% end %>

Params似乎是正确的:

    {"user"=>{"password_confirmation"=>"[FILTERED]", 
"roles_attrributes"=>{"id"=>"2"}, ...

解决方案我错误拼写的组合,不使用attr_accessible,需要访问permissions_attributes,并且表单稍微关闭。

型号:

has_many :permissions, :dependent => :destroy
has_many :roles, :through => :permissions
accepts_nested_attributes_for :permissions
attr_accessible :permissions_attributes

查看:

    <%  Role.all(:order => "rolename ASC").each_with_index do |role,idx| %>
    <%= check_box_tag( "user[permissions_attributes][#{idx}][role_id]",role.id) %>
    <%= role.rolename %>
    <br/>
    <% end %>

2 个答案:

答案 0 :(得分:5)

如果您更正了check_box_tag中属性的拼写,它看起来应该可以正常工作。

<% for role in Role.all %>
 <%= check_box_tag( "user[roles_attributes][id]",role.id) %>
 <%= role.rolename %>
 <br/>
<% end %>

答案 1 :(得分:3)

听起来这个属性没有标记为更新安全。您应该可以通过将以下内容添加到模型类来修复它:

attr_accessible :roles

或可能:

attr_accessible :roles_attributes

如果你看,你可能已经有一个attr_accessible调用,你可以添加它。有关详细信息,请在此处记录:

http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002226