2009-10-06 12 views
57

Me gustaría tener una lista de todos los nombres de atributos que se pueden asignar en masa. Lo necesito para un generador de formularios personalizado que no agregue campos de entrada de manera predeterminada que no se puedan asignar en masa. Por ejemplo, si tengo un modelo como:Cómo obtener la lista de atributos de un modelo activerecord que puede asignarse en masa

class Post < ActiveRecord::Base 
    attr_protected :account 

    belongs_to :author 

    validates_presence_of :title, :author 
end 

me gustaría tener como resultado una lista que contiene: autor,: título.

¿Alguna idea si existe tal método? ¿O algunas pautas sobre cómo puedo hacer una que haga esto?

Respuesta

89

Post.accessible_attributes lo cubriría si ha definido explícitamente attr_accessible

de restricción, que, haciendo algo como esto es torpe, pero funciona:

Post.new.attributes.keys - Post.protected_attributes.to_a 
+0

Gracias @semanticart por su respuesta! – Vincent

+0

así, si obtiene accessible_attributes los que están attr_accessible'd explícita y protected_attributes obtiene los que están attr_protect'd explícitamente, ¿existe un método que le dirá cuáles son accesibles independientemente de si están protegidos a través de attr_protected o attr_accessible? –

+0

Gracias por publicar. Esta fue una gran adición a mi método de atributos de filtro. – Kirk

22

sólo tiene que utilizar

Post.accessible_attributes 

que la voluntad devolver todo el attributes accessible de la clase

+1

en cuenta que si el uso de múltiples funciones, usted puede conseguir sus diferentes listas pasando el símbolo - 'Post.accessible_attributes (: usuario)', 'Post.accessible_attributes (admin) ', etc. También encontré' Post.active_authorizers' útil, devuelve un hash de todos los roles definidos y sus atributos accesibles. –

+1

Enlace roto y parece no funcionar para algunas versiones de rieles. –

+0

¿Qué versión de ruby ​​estás usando? – Antoine

55

Es posible que algunas de las respuestas mencionadas anteriormente no se apliquen a Rails 4.

Puede usar MyModel.attribute_names para obtener la matriz de atributos de tabla, aunque esto podría no otorgarle atributos de asignación masiva, ya que este aspecto de Rails cambia con la versión 4 http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

+2

esto es lo que necesitaba gracias. Estoy pirateando la desactivación de la asignación masiva solo para un modelo. :-) – NullVoxPopuli

13

Para los modelos se pueden utilizar MyModel.attribute_names o MyModel.column_names.

Para los casos se pueden utilizar MyModel.new.attribute_names.

0

Post.accessible_attributes.to_a.map(&:to_sym)

+1

Una pequeña explicación sería mejor. –

+0

** De la cola de revisión: ** Puedo solicitarle que agregue un poco más de contexto en torno a su respuesta. Las respuestas de solo código son difíciles de entender. Ayudará al solicitante y a los lectores futuros tanto si puede agregar más información en su publicación. –

Cuestiones relacionadas