2010-02-09 8 views
6

Dans mon application, seuls les utilisateurs disposant du rôle d'administrateur peuvent créer de nouveaux utilisateurs. Dans le nouveau formulaire utilisateur, j'ai une boîte de sélection pour chacun des rôles disponibles qui peuvent être assignés aux nouveaux utilisateurs.Rails: Pouvez-vous passer des arguments à la méthode after_create?

Je souhaite utiliser la méthode de rappel after_create pour attribuer le rôle à l'utilisateur. Comment puis-je accéder à la valeur sélectionnée de la zone de sélection dans la méthode after_create?

def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
     if @user.save 
     flash[:notice] = 'User creation successful.' 
     format.html { redirect_to @user } 
     else 
     format.html { render :action => 'new' } 
     end 
    end 
    end 

Dans le modèle de l'utilisateur que j'ai:

after_create :assign_roles 

    def assign_roles 
    self.has_role! 'owner', self 
    # self.has_role! params[:role] 
    end 

Je reçois une erreur parce que le modèle ne sait pas quel rôle.

Répondre

13

Vous pouvez utiliser attr_accessor pour créer un attribut virtuel et définir cet attribut dans le cadre de votre action de création.

+1

Oui, vous voulez un "attribut virtuel" pour contenir la sélection de case à cocher. Il y a un super Railscast sur ça: http://railscasts.com/episodes/167-more-on-virtual-attributes –

4

La réponse courte est, non. Vous ne pouvez pas passer d'arguments à after_create.

Cependant ce que vous essayez de faire est assez commun et il y a d'autres façons de le contourner.

La plupart d'entre elles impliquent l'attribution de la relation avant que l'objet en question ne soit créé, et laissez ActiveRecord s'occuper de tout.

La façon la plus simple d'y parvenir dépend de la relation entre les rôles et les utilisateurs. Si un utilisateur est un à plusieurs (chaque utilisateur a un rôle), vos utilisateurs appartiennent à un rôle et l'identificateur de rôle est envoyé via le formulaire.

<%= f.collection_select :role_id, Role.all, :id, :name %> 

S'il y a un grand nombre de plusieurs entre les utilisateurs et les rôles que vous atteindre même en attribuant à @ user.role_ids

<%= f.collection_select :role_ids, Role,all, :id, :name, {}, :multiple => :true %> 

Le contrôleur dans les deux cas ressemble

def create 
    @user = User.new(params[:user]) 

    respond_to do |format| 
    if @user.save 
     flash[:notice] = 'User creation successful.' 
     format.html { redirect_to @user } 
    else 
     format.html { render :action => 'new' } 
    end 
    end 
end 
Questions connexes