2010-04-16 5 views

Répondre

97

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

+1

pouvons-nous les utiliser ensemble? – Salil

+0

oui, mais les attributs peuvent être différents – fl00r

+4

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

7

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 
Questions connexes