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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top