2009-04-07 3 views
7

Je pensais qu'il aurait dû y avoir une solution simple, étant donné que Rails 2.3 a cette nouvelle fonctionnalité de formes imbriquées. Fondamentalement, je veux créer ou mettre à jour un utilisateur et leur assigner des rôles en même temps.Objet imbriqué w/Cases à cocher - assignation de masse même avec accept_nested_attributes_for?

Il semble que je fais tout correctement, mais je reçois l'erreur AVERTISSEMENT: Impossible d'attribuer en masse ces attributs protégés: roles_attrributes.

J'ai même essayé de changer la vue en user [permissions_attrributes] [role_id] parce que je pensais que peut-être la table de jointure déroutait Rails.

De toute façon, des suggestions sur comment cela devrait réellement fonctionner?

Modèle

class User < ActiveRecord::Base 

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

    accepts_nested_attributes_for :roles 
    accepts_nested_attributes_for :permissions 
end 

Extrait de la vue (notez que j'ai essayé et échoué à obtenir fields_for pour générer ce que je veux ici, peut-être c'est mon problème?)

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

Params venir semblent partout être droite:

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

Solution Une combinaison de moi faute d'orthographe, n'utilisant pas attr_accessible, ayant besoin d'accéder à permissions_attributes, et le formulaire étant légèrement désactivé.

Modèle:

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

Vue:

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

Répondre

3

il semble que cet attribut est pas marqué comme sûr pour la mise à jour. Vous devriez être en mesure de le corriger en ajoutant ce qui suit à votre classe de modèle:

attr_accessible :roles 

ou peut-être:

attr_accessible :roles_attributes 

Si vous regardez, vous pouvez déjà avoir un attr_accessible que vous appelez pouvez ajouter à. Pour plus d'informations, cela est documenté ici:

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

+0

J'ai cru comprendre que accept_nested_attributes_for ne l'exigeait pas. De toute façon, j'ai essayé les deux et aucun n'a fonctionné. – Bill

+0

Ce message d'erreur est certainement celui qui serait causé par un problème attr_protected ou attr_accessible. Aussi, http://apidock.com/rails/ActiveRecord/NestedAttributes/ClassMethods/accepts_nested_attributes_for indique que c'est quelque chose à connaître même avec ANAF. Peut-être vaut-il mieux regarder de plus près? –

5

Si vous corriger l'orthographe des attributs dans votre , il semble que cela devrait fonctionner.

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

Bonne prise! Cela expliquerait pourquoi l'attribut n'a pas été reconnu =) –

Questions connexes