15 votes

Rails : comment définir une variable temporaire qui n'est pas un champ de la base de données ?

Pour mon application, j'ai différents points d'entrée pour l'inscription qui valident les choses différemment.

Ainsi, dans l'inscription principale, rien n'est requis à l'exception de l'adresse électronique et du mot de passe. Dans un champ d'inscription alternatif, beaucoup d'autres champs sont requis. Ainsi, dans le modèle de l'utilisateur, j'ai

validate_presence_of :blah, :lah, :foo, :bah, :if => :flag_detected

def flag_detected
  !self.flag.nil?
end

Je veux activer ce drapeau via le contrôleur. Cependant, cet indicateur n'est pas un champ de la base de données. Je me demande si c'est réalisable avec Rails ou s'il y a quelque chose qui ne va pas dans ma façon de voir les choses ? Si c'est le cas, quelle est la meilleure façon de le faire ? Merci.

28voto

PeterWong Points 10070

Ce dont vous avez besoin, c'est attr_accessor

class User < ActiveRecord::Base
  attr_accessor :flag
  attr_accessible :flag # if you have used attr_accessible or attr_protected else where and you are going to set this field during mass-assignment. If you are going to do user.flag = true in your controller's action, then no need this line
end

En gros, attr_accessor :flag créer le user.flag y user.flag = ... pour votre modèle.

y attr_accessible est pour la protection de l'attribution de masse.

3voto

mmlac Points 498

Suivi du débat sur les meilleures pratiques :

Créez une méthode qui fait ce que vous voulez. Par exemple, save_with_additional_validation. Ce code est beaucoup plus clair et auto-documenté et fonctionne de la même manière. Appelez simplement cette méthode au lieu de save()

1voto

evfwcqcg Points 2774

Il semble que vous ayez besoin de définir la méthode setter

 class User < ActiveRecord::Base
   attr_accessible :flag

   def flag=(boolean)
     boolean
   end
 end

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