Está utilizando una terminología técnica de manera vaga que hace que su comprensión de este proceso se confunda, por lo que voy a aclarar esta terminología primero.
dónde y cómo puedo asignar al usuario: rol de administrador
El 'papel' se utiliza en el parámetro :as
a attr_accessible
no es un rol de usuario. Es un atributo rol. Significa que el atributo está protegido contra sobreescritura, a menos que ese rol se especifique en la declaración que establece el atributo. Entonces, este sistema es independiente de cualquier sistema de usuario. Su aplicación ni siquiera necesita que los usuarios tengan roles en la asignación masiva.
puedo definir mi propio papel como group_to_update
Los roles no son realmente "definidos" en ningún sentido formal. En cualquier lugar donde se espera un rol, simplemente use cualquier símbolo/cadena (por ejemplo, :group_to_update
) como rol. No es necesario especificarlo en otro lugar antes de tiempo.
Así es como funciona. Normalmente, durante la asignación masiva de un hash a los atributos del modelo, todos los atributos del modelo se usan como claves para el hash asignado.Así que si usted tiene un modelo Barn
y barn
instancia del mismo, con tres atributos horse
, cat
y rabbit
, entonces esto:
barn.attributes = params
es esencialmente lo mismo que hacer:
barn.horse = params[:horse]
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Ahora, si establece attr_accessible
en el modelo de granero, solo los atributos que establezca allí se actualizarán cuando use la asignación masiva. Ejemplo:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit
end
Entonces esto:
barn.attributes = params
hará solamente esto:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
Debido a que sólo 'gato' y 'conejo' se establecen para acceder ('caballo' no es) Ahora considere configurar un papel atributo de la siguiente manera:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
end
En primer lugar, observamos que el papel puede por cualquier cosa que desee, siempre y cuando es un símbolo/cadena. En este caso, hice el rol :banana
. Ahora, cuando establece un rol en un atributo attr_accessible
, normalmente no se asigna. Este:
barn.attributes = params
ahora sólo hacer esto:
barn.cat = params[:cat]
pero se pueden asignar atributos utilizando un papel específico utilizando el método assign_attributes
. Por lo que puede hacer:
barn.assign_attributes(params, :as => :banana)
Esto asignará todos los parametros protegidas normalmente, así como todos los parametros protegidos por el papel :banana
:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
por lo consideran un ejemplo más larga con más atributos:
class Barn < ActiveRecord::Base
attr_accessible :cat
attr_accessible :rabbit, :as => :banana
attr_accessible :horse, :as => :banana
attr_accessible :cow, :as => :happiness
end
Luego puede usar esos roles al asignar atributos. Este:
barn.assign_attributes(params, :as => :banana)
corresponde a:
barn.cat = params[:cat]
barn.rabbit = params[:rabbit]
barn.horse = params[:horse]
Y esto:
barn.assign_attributes(params, :as => :happiness)
corresponde a:
barn.cat = params[:cat]
barn.cow = params[:cow]
Ahora, si decide , puede hacer funciones de usuario (p. una columna "rol" en su modelo de Usuario) corresponde a roles de atributo en cualquier modelo.Por lo que podría hacer algo como esto:
barn.assign_attributes(params, :as => user.role)
Si esta función user
's pasa a ser banana
, entonces (utilizando nuestro último ejemplo de modelo) se fijará atributos de granero para el gato, conejo y caballo. Pero esta es solo una forma de usar roles de atributo. Depende totalmente de ti si quieres usarlos de otra manera.
+1 Gran respuesta. – Gazler
Gracias. Probablemente sea la única publicación que entra en el gran detalle sobre el rol en attr_accessible. Una pregunta más: ¿cómo evitará la asignación masiva? ¿No hay forma de que un hacker incluya el rol en la URL? – user938363
Excelente respuesta. Esto debería estar en alguna parte [en las guías?] En los documentos de Rails. – maprihoda