35 votes

Quelle est la différence entre attr_accessible (* attributs) et attr_protected (* attributs)?

Quelle est la différence entre attr_accessible(*attributes) et attr_protected(*attributes) ? Des exemples seraient bien.

Je vois beaucoup de développeurs les utiliser dans leurs modèles. J'ai googlé pour les différences, mais je ne comprends pas exactement ce qu'elles sont. Quelle est l’importance et sa nécessité dans différents scénarios?

99voto

mikej Points 30224

attr_accessible (documentation) dit: "les attributs spécifiés sont accessibles et tous les autres sont protégées" (pensez à la liste blanche.)

alors que

attr_protected (documentation) dit: "les attributs spécifiés sont protégés et tous les autres sont accessibles" (il pense que la mise en liste noire.)

Un attribut protégé est celui qui ne peut être modifié de façon explicite (p. ex. par l'intermédiaire de l'attribut=) et ne peut pas être mis à jour via la mesure de masse (par exemple à l'aide de model.update_attributes ou en passant des attributs new). Le comportement lors de la tentative de mise à jour d'un attribut protégé par la mesure de masse dépend de la mass_assignment_sanitizer (voir la mise à jour ci-dessous).

L'exemple classique serait un User modèle avait un is_admin d'attribut vous pouvez protéger cet attribut pour éviter les envois de formulaire qui permettrait à un utilisateur d'être un administrateur.

exemple:

class User < ActiveRecord::Base
  # explicitly protect is_admin, any new attributes added to the model
  # in future will be unprotected so we need to remember to come back
  # and add any other sensitive attributes here in the future
  attr_protected :is_admin
end

par rapport à:

class User < ActiveRecord::Base
  # explicitly unprotect name and bio, any new attributes added to the model
  # in the future will need to be listed here if we want them to be accessible
  attr_accessible :name, :bio
end

Maintenant, en supposant is_admin attribut est protégé:

> u = User.find_by_name('mikej')
> u.is_admin?
false
> u.update_attributes(:name => 'new name', :is_admin => true)
> u.is_admin?
false
> u.name
"new name" 
> u.is_admin = true # setting it explicitly
> u.save
> u.is_admin?
true

Mise à jour: les versions Ultérieures de Rails ont introduit la notion de masse d'attribution de désinfectant pour contrôler le comportement lors de la tentative de mise à jour des caractéristiques protégées par la mesure de masse. Dans les Rails 3.2 et plus tard cela peut être contrôlée par la définition d' mass_assignment_sanitizer dans la config. La valeur par défaut est de connecter les tentatives et permettre l'exécution de code à continuer, mais l'environnement standard de config pour le développement définit ce :strict qui pose exception d'une tentative de mise à jour d'un attribut protégé.

7voto

gregor Points 1762

attr_accessible est une liste blanche pour l'affectation en masse ...

 class Foo < ActiveRecord::Base #has attributes foo and bar
  attr_accessible :foo
end
f = Foo.new :foo => "test", :bar => "test"
f.foo #=> "test"
f.bar #=> nil
 

attr_proteceted est une liste noire pour l'affectation en masse ...

 class Foo < ActiveRecord::Base #has attributes foo and bar
  attr_protected :bar
end
f = Foo.new :foo => "test", :bar => "test"
f.foo #=> "test"
f.bar #=> nil
 

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