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

Bil*_*ill 7 activerecord ruby-on-rails 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
Run Code Online (Sandbox Code Playgroud)

从视图中摘录(注意我试过并且没有得到fields_for来生成我想要的东西,也许那是我的问题?)

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

遇到的参数似乎是正确的:

    {"user"=>{"password_confirmation"=>"[FILTERED]", 
"roles_attrributes"=>{"id"=>"2"}, ...
Run Code Online (Sandbox Code Playgroud)

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

模型:

has_many :permissions, :dependent => :destroy
has_many :roles, :through => :permissions
accepts_nested_attributes_for :permissions
attr_accessible :permissions_attributes
Run Code Online (Sandbox Code Playgroud)

视图:

    <%  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 %>
Run Code Online (Sandbox Code Playgroud)

Sar*_*Mei 5

如果你更正了你的属性的拼写check_box_tag,它看起来应该工作.

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


Ada*_*der 3

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

attr_accessible :roles
Run Code Online (Sandbox Code Playgroud)

或者可能:

attr_accessible :roles_attributes
Run Code Online (Sandbox Code Playgroud)

如果您查看,您可能已经有一个 attr_accessible 调用,您可以将其添加到其中。有关详细信息,请参阅此处:

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