Pregunta

Estoy intentando agregar una autorización de dispositivo a mi aplicación rails 3. Todo va bien, excepto que también estoy tratando de seguir este tutorial para establecer dinámicamente attr_accessible pararole_ids solo para usuarios administradores (no quiero que los usuarios regulares cambien su rol, pero un administrador debería poder hacerlo) ... el problema es que el enfoque del tutorial de railscast asume que tengo acceso para cambiar el comportamiento del controlador cuando, de hecho, el diseño esmanejando todo eso debajo del capó.

Ayuda

¿Fue útil?

Solución

Puede subclasificar los controladores de Devise, solo tiene que generar las vistas y moverlas al lugar correcto.Consulte "Configuración de vistas" y "Configuración de controladores" en el archivo Léame de Devise.

Terminé agregando role_ids a attr_accessible, luego subclasificando el RegistrationsController y agregando un before_filter para eliminar ese parámetro para los no administradores.

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

Solo asegúrese de agregar las vistas de registro a /app/views/users/registrations/.

Otros consejos

La mejor manera que encontré para manejar esto es desde RailsCast 237 .Es más detallado que la respuesta de Arrel, pero no te obliga a agregar rol (u otros campos) a attr_accessible.

Agregue el siguiente método en un inicializador:

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

Luego, en su controlador, puede hacer:

user.accessible=: role if can?: set_role, recurso

Desafortunadamente, esta llamada debe realizarse después de que se haya creado una instancia del objeto del usuario (o lo que sea).Eso significa que tendría que crear una subclase del controlador y llamar a esto después de la instanciación de recursos en actualización y creación.

Esto es para Rails 3.2.En versiones anteriores, creo que el método mass_assignment_authorizer no toma un parámetro.El atributo attr_accessible sin valores establece una denegación total de la aplicación a prueba de fallas para la asignación masiva.Esto también se puede hacer en el archivo application.rb con

config.active_record.whitelist_attributes = true
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top