我认为应该有一个简单的解决方案,因为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 %>
答案 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