2011-04-21 1 views
0

J'essaye de mettre en place une application de Rails 3 pour manipuler des rôles d'utilisateur avec Devise et CanCan.Les cases à cocher obtiennent mais ne mettent pas plusieurs-à-plusieurs rôles

Mes relations sont les suivantes

class User < ActiveRecord::Base 
    has_many :users_roles 
    has_many :roles, :through => :users_roles 
end 

class Role < ActiveRecord::Base 
    has_many :users_roles 
    has_many :users, :through => :users_roles 
end 

class UsersRole < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :role 
end 

En fait, tout fonctionne bien. Devise gère parfaitement l'authentification. CanCan restreint le comportement de l'utilisateur en fonction de la capacité.rb.

Mais j'ai un problème ridicule avec la définition d'un UsersRole.

J'ai défini des cases à cocher sur la page d'édition de l'utilisateur comme ça. Si je crée un UserRole via la console, ces cases à cocher sont vérifiées en fonction du rôle de l'utilisateur.

Mais je ne peux pas définir ou modifier les rôles en utilisant ces cases à cocher!

J'ai été partout dans les maisons avec ceci - variations de syntaxe, commuté à une approche de HABTM et de roles_mask, reconstruit mes modèles et contrôleurs plusieurs fois - tout à l'effet nul.

En fait, le titre de ma question n'est pas tout à fait correct - les cases mettent

_method put 
authenticity_token XGl6s1iyXJfahdgftc3df8q1ZeehMVzs3LxiQH98jGw= 
commit Update 
user[current_password] password 
user[email] [email protected] 
user[name] User Name 
user[password] 
user[password_confirmatio...  
user[role_ids][] 1 
user[role_ids][] 4 
user[role_ids][]  
utf8 ✓ 

Mais ces valeurs ne sont pas définies dans la base de données.

Qu'est-ce que je fais de mal ?? !!!

Répondre

2

Je suppose que vous avez spécifié attr_accesible dans votre modèle utilisateur et que role_ids ne figure pas là (et il ne devrait pas être)

Si cela est combiné avec un appel update_attributes dans votre contrôleur, puis role_ids ne seront jamais régler correctement.

Si tel est le cas, alors vous devriez être en mesure de définir manuellement les role_ids dans votre contrôleur comme ça avant de mettre à jour ou de sauvegarder:

@user.role_ids = params[:user][:role_ids] 

Bien sûr, je ne suis pas certain que c'est le cas depuis Vous n'avez pas inclus le code de votre contrôleur ni aucun détail avec le modèle Utilisateur.

Edit:

Au lieu de cela, si faire les @ user.update_attributes dans le contrôleur, vous pouvez le modifier à ce qui suit à la place:

#The same as update_attributes, but without the save 
@user.attributes = params[:user] 

# Here the role_ids get assigned manually so it does not need to be in attr_accesible 
@user.role_ids = params[:user][:role_ids] if params[:user] 

# And here it gets checked if the save was successfull 
if @user.save 
    render :action => :show 
else 
    render :action => :edit 
end 
+0

Vous êtes tout à fait raison! C'est toujours les petites choses que tu négliges. J'ai spécifié role_ids comme attr_accesible et tout fonctionne. Maintenant, essayant d'implémenter votre contrôleur. L'appelleriez-vous en tant que before_save? –

+0

Génial. Fait quelques suggestions de la façon de le manipuler dans le contrôleur – DanneManne

+0

J'ai le même code exact mais l'affichage n'est pas rendu et ai reçu un message: méthode non définie 'first 'pour faux: FalseClass. s'il vous plaît laissez-moi savoir ce qui pourrait être le problème – amj

Questions connexes