80 votes

ActiveRecord : Comment obtenir tous les attributs d'un modèle qui peuvent être attribués en masse ?

J'aimerais avoir une liste de tous les noms d'attributs qui peuvent être attribués en masse. J'en ai besoin pour un constructeur de formulaire personnalisé qui n'ajoutera pas de champs de saisie par défaut qui ne peuvent pas être attribués en masse.

Par exemple, si j'ai le modèle suivant :

class Post < ActiveRecord::Base
  attr_protected :account

  belongs_to :author

  validates_presence_of :title, :author
end

J'aimerais avoir comme résultat [:author, :title] .

106voto

semanticart Points 2773

Post.accessible_attributes le couvrirait si vous définissiez explicitement attr_accessible.

En dehors de cela, faire quelque chose comme ça est maladroit mais fonctionne :

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

0 votes

Donc, si accessible_attributes récupère ceux qui sont explicitement attr_accessible et protected_attributes ceux qui sont explicitement attr_protectés, existe-t-il une méthode qui vous dira lesquels sont accessibles indépendamment du fait qu'ils soient protégés par attr_protected ou attr_accessible ?

0 votes

Merci d'avoir posté. C'est un excellent complément à ma méthode d'attribution des filtres.

4 votes

Il y a un problème, cela fera apparaître :created_at, :updated_at comme des attributs accessibles ! !, ils ne le sont pas.

88voto

Victor S Points 1615

Certaines des réponses mentionnées précédemment peuvent ne pas s'appliquer à Rails 4.

Vous pouvez utiliser MyModel.attribute_names pour obtenir le tableau des attributs de la table, bien que cela puisse ne pas vous donner les attributs assignables en masse, car cet aspect de Rails change avec la version 4. http://weblog.rubyonrails.org/2012/3/21/strong-parameters/

2 votes

C'est ce dont j'avais besoin, merci. Je suis en train de bidouiller la désactivation de l'affectation de masse pour un modèle :-)

27voto

Scudelletti Points 89

Pour les modèles, vous pouvez utiliser MyModel.attribute_names o MyModel.column_names .

Pour les instances, vous pouvez utiliser MyModel.new.attribute_names .

25voto

Antoine Points 626

Il suffit d'utiliser

Post.accessible_attributes

Cela renverra toutes les attributs accessibles de la classe

1 votes

Notez que si vous utilisez plusieurs rôles, vous pouvez obtenir vos différentes listes en passant le symbole - Post.accessible_attributes(:user) , Post.accessible_attributes(:admin) etc. J'ai aussi trouvé Post.active_authorizers utile, il renvoie un hachage de tous les rôles définis et de leurs attributs accessibles.

0 votes

Quelle version de ruby utilisez-vous ?

1 votes

J'utilise Ruby 2.2.2 et Rails 4.1.2 : J'ai un User soutenu par une table de base de données. Pour User.accessible_attributes j'obtiens NoMethodError: undefined method "accessible_attributes" for #<Class:0x007f9216346fe8>

3voto

Rajesh Paul Points 1706

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X