Rails Devise problema attr_accessible
-
27-10-2019 - |
Domanda
Sto cercando di aggiungere l'autorizzazione a devise alla mia app rails 3. Va tutto bene tranne che sto anche cercando di seguire questo tutorial per impostare dinamicamente attr_accessible perrole_ids solo per gli utenti admin (non voglio che gli utenti regolari cambino il loro ruolo, ma un amministratore dovrebbe essere in grado di farlo) ... il problema è che l'approccio del tutorial di railscast presuppone che io abbia accesso per modificare il comportamento del controller quando in realtà lo ègestire tutto ciò sotto il cofano.
Per favore aiutatemi
Soluzione
Puoi sottoclassare i controller Devise, devi solo generare le viste e spostarle nella posizione corretta.Controlla "Configurazione delle viste" e "Configurazione dei controller" nel file readme di Devise.
Ho finito per aggiungere role_ids ad attr_accessible, quindi creare una sottoclasse di RegistrationsController e aggiungere un before_filter per rimuovere quel parametro per i non amministratori.
class Users::RegistrationsController < Devise::RegistrationsController
before_filter :remove_admin_params, :only => [:create, :update]
protected
# disable setting the role_ids value unless an admin is doing the edit.
def remove_admin_params
params[:user].delete(:role_ids) unless current_user.try(:admin?)
end
end
Assicurati solo di aggiungere le viste di registrazione a /app/views/users/registrations/
.
Altri suggerimenti
Il modo migliore che ho trovato per gestirlo è da RailsCast 237 .È più prolisso della risposta di Arrel, ma non ti obbliga ad aggiungere ruolo (o altri campi) ad attr_accessible.
Aggiungi il seguente metodo in un inizializzatore:
class ActiveRecord::Base
attr_accessible
attr_accessor :accessible
private
def mass_assignment_authorizer(role = :default)
if accessible == :all
self.class.protected_attributes # hack
else
# super returns a whitelist object
super + (accessible || [])
end
end
end
Quindi nel controller, puoi fare:
user.accessible=: role if can?: set_role, risorsa
Questa chiamata, sfortunatamente, deve essere effettuata dopo che è stata istanziata l'oggetto utente (o qualsiasi altra cosa).Ciò significa che dovresti sottoclassare il controller e richiamarlo dopo l'istanza della risorsa in update e crea.
Questo è per Rails 3.2.Nelle versioni precedenti credo che il metodo mass_assignment_authorizer non prenda un parametro.L'attr_accessible senza valori imposta una negazione a livello di applicazione a prova di errore per l'assegnazione di massa.Questo può essere fatto anche nel file application.rb con
config.active_record.whitelist_attributes = true