2009-10-06 10 views
57

Vorrei avere un elenco di tutti i nomi di attributi che possono essere assegnati in serie. Ho bisogno di questo per un generatore di moduli personalizzato che non aggiungerà campi di input per impostazione predefinita che non possono essere assegnati alla massa. Per esempio, se ho un modello come:Come ottenere l'elenco degli attributi di un modello activerecord che può essere assegnato in serie

class Post < ActiveRecord::Base 
    attr_protected :account 

    belongs_to :author 

    validates_presence_of :title, :author 
end 

mi piacerebbe avere come risultato un elenco contenente: autore,: titolo.

Qualche idea se esiste un tale metodo? O alcune linee guida su come posso farne una che faccia questo?

risposta

89

Post.accessible_attributes sarebbe coprirlo se hai esplicitamente definito attr_accessible

blocco, che, facendo qualcosa di simile è goffo, ma funziona:

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

Grazie @semanticart per la risposta! – Vincent

+0

quindi, se accessi_attributi ottiene quelli che sono esplicitamente attr_accessible'd e protected_attributes ottiene quelli che sono esplicitamente attr_protect'd, c'è un metodo che ti dirà quali sono accessibili indipendentemente dal fatto che siano protetti tramite attr_protected o attr_accessible? –

+0

Grazie per la pubblicazione. Questa è stata una grande aggiunta al mio metodo di attributi del filtro. – Kirk

22

Basta usare

Post.accessible_attributes 

che verrà restituire tutti gli attributes accessible della classe

+1

Si noti che se si utilizzano più ruoli, è possibile ottenere i diversi elenchi passando il simbolo - 'Post.accessible_attributes (: user)', 'Post.accessible_attributes (: admin) ', ecc. Ho anche trovato utile' Post.active_authorizers', restituisce un hash di tutti i ruoli definiti e i loro attributi accessibili. –

+1

Collegamento interrotto e sembra non funzionare per alcune versioni di guide. –

+0

Quale versione di ruby ​​stai usando? – Antoine

55

Alcune delle risposte precedentemente menzionate potrebbero non essere valide per Rails 4.

È possibile utilizzare MyModel.attribute_names per ottenere l'array di attributi di tabella, anche se questo potrebbe non fornire attributi di massa assegnabili, poiché questo aspetto di Rails cambia con la versione 4 http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

+2

questo è ciò di cui avevo bisogno, grazie. Sto hacking disabilitando l'assegnazione di massa solo per un modello. :-) – NullVoxPopuli

13

Per i modelli è possibile utilizzare MyModel.attribute_names o MyModel.column_names.

Per le istanze è possibile utilizzare MyModel.new.attribute_names.

0

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

+1

Una piccola spiegazione sarebbe meglio. –

+0

** Dalla coda di revisione: ** Posso chiederti di aggiungere un po 'più di contesto intorno alla tua risposta. Le risposte al solo codice sono difficili da capire. Aiuterà il richiedente e i futuri lettori sia se puoi aggiungere ulteriori informazioni nel tuo post. –

Problemi correlati