Problema attr_accessible de Rails Devise
-
27-10-2019 - |
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
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