52 votes

utilisation de attr_accessor dans Rails

Quand utilisez-vous attr_reader / attr_writer - attr_accessor dans les modèles Rails?

64voto

Peter Points 38320

Jamais, sauf si vous avez un besoin spécifique pour cela. Automatique de la base de données adossés à des accesseurs sont créés pour vous, donc vous n'avez pas besoin de s'inquiéter.

Tout attr_accessors vous ne créez modifiez la pertinente @attr sur les rails de l'objet, mais ce sera perdu lorsque l'objet est détruit, à moins que vous le recoller dans la base de données. Parfois, vous ne voulez que ce comportement, mais il est inhabituel dans une application rails.

Maintenant, en ruby, c'est une autre histoire, et vous vous retrouvez à l'aide de ces très fréquemment. Mais je serais surpris si vous en avez besoin dans les rails---surtout au début.

54voto

Noah Thorp Points 456

attr_accessor peut être utilisé pour les valeurs que vous ne souhaitez pas stocker directement dans la base de données et qui n'existeront que pendant la durée de vie de l'objet (par exemple, les mots de passe).

attr_reader peut être utilisé comme une alternative parmi plusieurs solutions:

 def instance_value
  "my value"
end
 

12voto

Bryce Points 1620

Rails modèles sont juste ruby classes qui héritent de ActiveRecord::Base. ActiveRecord emploie attr_accessors pour définir les getters et setters pour la colonne des noms qui font référence à la classe ruby table. Il est important de noter que ce n'est qu'à la persistance; les modèles sont toujours classes ruby.

attr_accessor :foo est simplement un raccourci pour les éléments suivants:

def foo=(var)
  @foo = var
end

def foo
  @foo
end

attr_reader :foo est simplement un raccourci pour les éléments suivants:

def foo
  @foo
end

attr_writer :foo est un raccourci pour les éléments suivants:

def foo=(var)
  @foo = var
end

attr_accessor est un raccourci pour le getter et setter tout attr_reader est le raccourci pour le getter et attr_writer est un raccourci pour tout le setter.

Dans les rails, ActiveRecord utilise ces getters et setters dans un moyen pratique pour lire et écrire les valeurs à la base de données. MAIS, la base de données est la couche de persistance. Vous devez être libre de les utiliser attr_accessor et attr_reader comme vous le feriez de toute autre classe ruby pour bien composer votre logique métier. Que vous avez besoin pour obtenir et définir les attributs de vos objets en dehors de ce que vous avez besoin pour persister à la base de données, utilisez l' attr_s en conséquence.

Plus d'infos:

http://apidock.com/ruby/Module/attr_accessor

http://www.rubyist.net/~slagell/ruby/accessors.html

Qu'est-ce que attr_accessor en Ruby?

1voto

Benson Clark Points 21

Si vous l'utilisez pour valider l'acceptation de terms_of_service, vous devriez vraiment envisager d'utiliser validates: terms_of_service, :accept = = true. Cela créera un attribut virtuel et sera beaucoup plus concis.

http://guides.rubyonrails.org/active_record_validations.html#acceptance .

0voto

lulalala Points 3895

Un exemple est d'avoir plusieurs options stockées dans une colonne sérialisée. Form Builder se plaindrait si vous essayez d'avoir un champ de texte pour l'une de ces options. Vous pouvez utiliser attr_accessor pour le simuler, puis, dans l'action de mise à jour, enregistrez-le dans la colonne en série.

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