2012-03-15 19 views
8

Ho un'app Rails con un modello utente che contiene un attributo admin. È bloccato usando attr_accessible. Il mio modello è simile al seguente:Rails 3.2, Assegnazione di massa, Ruoli dinamici?

attr_accessible :name, :email, :other_email, :plant_id, :password, :password_confirmation 
attr_accessible :name, :email, :other_email, :plant_id, :password, :password_confirmation, :admin, :as => :admin 

Ed ecco ciò che il mio metodo di aggiornamento nel mio controller utenti assomiglia:

def update 
    @user = User.find(params[:id]) 
    if @user.update_attributes(params[:user], :as => current_user_role.to_sym) 
    flash[:notice] = "Profile updated" 
    redirect_to edit_user_url(@user) 
    else 
    render 'edit' 
    end 
end 

Ho un metodo di supporto nel mio controller applicazione che passa di nuovo il ruolo come una stringa :

def current_user_role 
    @current_user_role ||= current_user.admin? ? "admin" : "default" 
end 
helper_method :current_user_role 

ho anche impostato config.active_record.whitelist_attributes = true in config/application.rb.

Ho verificato che il metodo current_user_role restituisce il valore corretto in base allo stato di amministratore dell'utente corrente. Rails non sta generando un errore di assegnazione di massa. Ma quando provo ad aggiornare lo stato di amministratore di un utente mentre sono loggato come amministratore, Rails esegue l'aggiornamento e ignora silenziosamente l'attributo admin. Tirando su il record dell'utente nella console di Rails si mostra che il record non è stato modificato.

Ho la sensazione che ci sia un problema specifico di Ruby o di Rails in gioco di cui non sono a conoscenza. Non riesco a trovare nessuna informazione su come rendere dinamico il ruolo. Il meglio che ho trovato è stato this.

+2

Se sto capendo correttamente, hai risposto alla tua stessa domanda. In tal caso, è necessario pubblicare la risposta come risposta (non una modifica alla domanda) e accettarla. –

risposta

3

C'è stato un attr_accessor errante: admin nel mio modello che è stato lasciato dentro da un precedente tentativo di ottenere questo al lavoro. L'ho trascurato. Rimuovendolo ha riparato.

Quindi, il risultato è che questo è un modo abbastanza semplice per far funzionare ruoli dinamici in Rails 3.2.