2010-02-09 15 views
6

Nella mia applicazione, solo gli utenti con ruolo di amministratore possono creare nuovi utenti. Nel nuovo modulo utente, ho una casella di selezione per ciascuno dei ruoli disponibili che possono essere assegnati ai nuovi utenti.Rails: puoi passare argomenti al metodo after_create?

Spero di utilizzare il metodo callback after_create per assegnare il ruolo all'utente. Come posso accedere al valore selezionato della casella di selezione nel metodo 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 

Nel modello utente che ho:

after_create :assign_roles 

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

ricevo un errore perché il modello non sa quale ruolo è.

risposta

13

È possibile utilizzare attr_accessor per creare un attributo virtuale e impostare tale attributo come parte dell'azione di creazione.

+1

Sì, quello che vuoi è un "attributo virtuale" per contenere la selezione della casella di controllo. C'è un grande Railscast su questo: http://railscasts.com/episodes/167-more-on-virtual-attributes –

4

La risposta breve è, no. Non puoi passare alcun argomento a after_create.

Tuttavia, quello che stai cercando di fare è piuttosto comune e ci sono altri modi per aggirarlo.

Molti di questi prevedono l'assegnazione della relazione prima che l'oggetto in questione venga creato e che ActiveRecord si occupi di tutto.

Il modo più semplice per eseguire ciò dipende dalla relazione tra ruoli e utenti. Se è uno a molti (ogni utente ha un ruolo), gli utenti devono appartenere a un ruolo e inviare role_id tramite il modulo.

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

Se v'è una relazione molti a molti rapporti tra utenti e ruoli a raggiungere lo stesso assegnando a @ user.role_ids

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

Il controllore in entrambi i casi si presenta come

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 
Problemi correlati