2009-04-07 5 views
7

Ich dachte, dass es eine einfache Lösung dafür geben sollte, da Rails 2.3 diese neumodischen verschachtelten Formulare hat. Grundsätzlich möchte ich einen Benutzer erstellen oder aktualisieren und ihnen gleichzeitig Rollen zuweisen.Verschachteltes Objekt mit Checkboxen - Massenzuweisung auch mit accresents_nested_attributes_for?

Es scheint, als ob ich alles richtig mache, aber ich bekomme den Fehler Warnung: Diese geschützten Attribute können nicht massenweise zugeordnet werden: roles_attrributes.

Ich habe sogar versucht, die Ansicht zu Benutzer [Berechtigungen_attributes] [Role_id] ändern, weil ich dachte, dass die Join-Tabelle Rails möglicherweise verwirrend war.

Wie auch immer, irgendwelche Vorschläge, wie das eigentlich funktionieren sollte?

Modell

class User < ActiveRecord::Base 

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

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

Auszug aus Sicht (merke ich versucht und sind gescheitert fields_for kennen zu erzeugen, was ich hier will, vielleicht ist das mein Problem?)

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

Params über scheinen kommen zu sein rechts:

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

Lösung Eine Kombination von mir falsch geschrieben, nicht mit attr_accessible, müssen Zugriff auf Berechtigungen_Attribute, und das Formular ist leicht aus.

Modell:

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

Ausblick:

<% 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 %> 

Antwort

3

es klingt wie dieses Attribut nicht als sicher für die Aktualisierung markiert ist. Sie sollten es zu beheben, indem Sie Folgendes mit denen Sie Ihre Modellklasse in der Lage:

attr_accessible :roles 

oder möglicherweise:

attr_accessible :roles_attributes 

Wenn Sie schauen, können Sie bereits ein attr_accessible anrufen können Sie diese hinzufügen. Für weitere Informationen wird dies hier dokumentiert:

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

+0

Es war mein Verständnis, dass access_nested_attributes_for das nicht benötigt. Wie auch immer, ich habe beides versucht und auch nicht gearbeitet. – Bill

+0

Diese Fehlermeldung wird definitiv von einem attr_protected oder attr_accessible Problem verursacht. Auch http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for weist darauf hin, dass auch bei ANAF etwas zu beachten ist. Vielleicht einen genaueren Blick wert? –

5

Wenn Sie die Schreibweise der Attribute in Ihrem korrigieren, es sieht aus wie es funktionieren soll.

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

Guter Fang! Das würde erklären, warum das Attribut nicht erkannt wurde =) –

Verwandte Themen