Quelle est la différence entre attr_accessible(*attributes)
& attr_protected(*attributes)
? Les exemples seraient bien. Je vois de nombreux développeurs les utiliser dans leurs modèles. J'ai googlé pour les différences, mais je ne comprends pas exactement ce qu'ils sont. Quelle est l'importance et sa nécessité dans différents scénarios?Quelle est la différence entre attr_accessible (* attributes) et attr_protected (* attributes)?
Répondre
attr_accessible
(documentation) dit "les attributs spécifiés sont accessibles et tous les autres sont protégés" (penser comme whitelisting.)
alors que
attr_protected
(documentation) dit « les attributs spécifiés sont protégés et tous les autres sont accessibles »(penser comme blacklisting.)
un attribut protégé est celui qui ne peut être modifié de façon explicite (par exemple via attribut =) et ne peut pas être mis à jour via l'affectation de masse (par ex. en utilisant model.update_attributes
ou en passant des attributs à new
). Le comportement lors d'une tentative de mise à jour d'un attribut protégé via l'attribution de masse dépend du paramètre mass_assignment_sanitizer
(voir la mise à jour ci-dessous).
L'exemple classique serait si un modèle User
avait un is_admin
attribut, vous pouvez protéger cet attribut pour empêcher la soumission de formulaire permettant à tout utilisateur à définir en tant qu'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: versions ultérieures de Rails introduit le concept d'un assainisseur d'assignation de masse pour contrôler le comportement lors de tentatives de mise à jour d'attributs protégés via l'assignation de masse. Dans Rails 3.2 et versions ultérieures, ceci peut être contrôlé en définissant mass_assignment_sanitizer
dans config. La valeur par défaut consiste simplement à consigner les tentatives et à permettre l'exécution du code, mais la configuration de l'environnement standard pour le développement attribue cette valeur à :strict
qui déclenche une exception lors d'une tentative de mise à jour d'un attribut protégé.
attr_accessible est une liste blanche pour la masse affectation ...
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 de 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
- 1. createDirectoryAtPath: attributes: alternative
- 2. NHibernate Mapping Attributes + Dirty Checking
- 3. Onglets jQuery ui - get options attributes
- 4. Quelle est la différence entre dict() et {}?
- 5. Quelle est la différence entre "$^N" et "$ +"?
- 6. Quelle est la différence entre = et: =
- 7. quelle est la différence entre:.! et: r !?
- 8. Quelle est la différence entre ~ et! opérateur?
- 9. Python/Tkinter: Appliquer la méthode .attributes() à Frame vs. Window?
- 10. bypass attr_accessible/protected in rails
- 11. Quelle est la différence entre l'utilisation de theme() et theme_links() pour afficher le lien HTML?
- 12. Quelle est la différence entre la saturation et la luminosité?
- 13. Quelle est la différence entre ces extraits?
- 14. Quelle est la différence entre applicationDidReceiveMemoryWarning, didReceiveMemoryWarning?
- 15. Quelle est la différence entre ces importations?
- 16. Quelle est la différence entre ces commentaires
- 17. Quelle est la différence entre la sérialisation et l'encodage?
- 18. Quelle est la différence entre la version et l'itération?
- 19. Quelle est la différence entre la programmation parallèle et multicœur?
- 20. Quelle est la différence entre la plate-forme et l'outil?
- 21. Quelle est la différence entre le tuyau et la douille?
- 22. Quelle est la différence entre ces codes?
- 23. Quelle est la différence entre ces conditions?
- 24. Est-il prudent d'utiliser la collection Attributes pour stocker des données supplémentaires?
- 25. Quelle est la différence
- 26. Quelle est la différence entre JAIN SIP et MJSIP?
- 27. Quelle est la différence entre openGL et EAGL/openAL?
- 28. Quelle est la différence entre un nanokernel et un exokernel?
- 29. Quelle est la différence entre UML 2.1.2 et UML 2.2
- 30. Quelle est la différence entre ASP.NET DynamicData et IronSpeed?
pouvons-nous les utiliser ensemble? – Salil
oui, mais les attributs peuvent être différents – fl00r
Non, vous ne pouvez utiliser que l'un ou l'autre. Si vous incluez les deux dans une classe, vous ne verrez pas d'erreur lors du premier chargement de la classe, mais elle se manifestera probablement par NoMethodError: vous avez un objet nul lorsque vous ne l'attendiez pas! la classe. – mikej