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é.