7

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

似乎我做的一切都是正确的,但我收到错误警告:无法批量分配这些受保护的属性:roles_attributes

我什至尝试将视图更改为 user[permissions_attributes][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 %>

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

    {"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 %>
4

2 回答 2

5

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

<% for role in Role.all %>
 <%= check_box_tag( "user[roles_attributes][id]",role.id) %>
 <%= role.rolename %>
 <br/>
<% end %>
于 2009-04-07T21:02:08.013 回答
3

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

attr_accessible :roles

或者可能:

attr_accessible :roles_attributes

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

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

于 2009-04-07T20:00:59.797 回答