2009-04-07 64 views
7

我認爲應該是一個簡單的解決這個,因爲Rails的2.3有這個新奇的嵌套形式的功能。基本上我想創建或更新一個用戶,並在同一時間分配他們的角色。嵌套的對象W /複選框 - 大衆分配甚至accepts_nested_attributes_for?

看來我正在做的一切正確,但我得到的錯誤警告:無法批量分配這些受保護的屬性: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 %> 

回答

3

這聽起來像這樣的屬性沒有標記爲更新的安全。您應該能夠通過添加修復它下面給你的模型類:

attr_accessible :roles 

或可能:

attr_accessible :roles_attributes 

如果你看看,你可能已經有一個attr_accessible叫你可以將它添加到。欲瞭解更多信息,這是記錄在這裏:

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

+0

這是我的理解,accept_nested_attributes_for不需要。無論如何,我已經嘗試過兩種都沒有工作。 – Bill 2009-04-07 20:09:49

+0

該錯誤消息絕對是一個會通過attr_protected或attr_accessible問題引起的。另外http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for表明即使使用ANAF也需要注意這一點。可能值得仔細觀察? – 2009-04-07 20:21:26

5

如果正確的屬性的拼寫你的,它看起來像它應該工作。

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