2009-11-24 6 views
10

Lorsque j'utilise le attr_accessible pour spécifier les champs de mon modèle que je vais exposer, est-ce vrai aussi pour script/console? Je veux dire quelque chose que je n'ai pas spécifié comme attr_accessible ne sera pas accessible aussi bien à travers la console?attr_accessible in rails Enregistrement actif

Répondre

19

Ceci n'est vrai que pour l'attribution de masse. Par exemple, si vous deviez mettre attr_protected :protected dans votre modèle:

>> Person.new(:protected => "test") 
=> #<Person protected: nil> 

A l'inverse, vous pouvez définir tous les attributs que vous voulez aussi accessibles à l'aide attr_accessible.

Cependant, ce qui suit fonctionne toujours:

>> person = Person.new 
=> #<Person protected: nil> 
>> person.protected = "test" 
=> #<Person protected: "test"> 

Ce comportement est le même que dans les contrôleurs, vues, etc. attr_protectedne protège contre l'affectation de masse des variables, principalement des formes, etc.

7

J'ai trouvé pourquoi:

Spécifie une liste blanche des attributs de modèle qui peuvent être définies par affectation de masse, comme new(attributes), update_attributes(attributes) ou attributes=(attributes). Ce est à l'opposé de la macro attr_protected:

Mass-assignment will only set attributes in this list, to assign to the rest of 
attributes you can use direct writer methods. This is meant to protect sensitive 
attributes from being overwritten by malicious users tampering with URLs or forms. 
If you‘d rather start from an all-open default and restrict attributes as needed, 
have a look at `attr_protected`. 

Donc cela signifie que juste éviter affectation de masse, mais je peux encore définir une valeur.

7

La console se comporte exactement comme votre application Rails. Si vous avez protégé certains attributs pour un modèle spécifique, vous ne pourrez pas affecter ces attributs à la console ou à l'application Rails elle-même.

1

Lorsque vous spécifiez que quelque chose doit être attr_accessible, seules ces choses peuvent être accédées dans la console ou par l'interface du site Web.

par exemple: Supposons que vous avez fait name et email être attr_accessible:

attr_accessible :name, :email 

et à gauche sur created_at et updated_at (que vous êtes censé). Ensuite, vous ne pouvez modifier/mettre à jour ces champs dans la console.

0

Si vous souhaitez exposer un champ sous forme de votre modèle, vous pouvez utiliser

attr_accessor :meth # for getter and setters 
attr_writer :meth # for setters 
attr_reader :meth # for getters 

ou si vous voulez ajouter un comportement à votre attribut, vous aurez à utiliser des attributs virtuels

def meth=(args) 
... 
end 
def meth 
... 
end 

à votre santé.

Questions connexes