2010-02-19 11 views
4

Normalement, lorsque vous utilisez des aides de formulaire dans Rails, chaque champ est directement corrélé à une méthode sur l'objet approprié.Utilisation d'aides de formulaire Rails sur des méthodes inexistantes

Cependant, j'ai un formulaire (inscription de l'utilisateur) qui doit inclure des champs qui ne font pas partie du modèle utilisateur lui-même (par exemple, les détails de la carte) mais qui doivent apparaître.

Comment puis-je créer le formulaire pour que je puisse obtenir les champs nécessaires et les valider comme je le souhaite (afin qu'il corresponde à toutes mes autres validations) sans salir mon modèle utilisateur?

Répondre

3

Je ne suis pas sûr de ce que vous entendez par "sale" votre modèle d'utilisateur, mais vous pouvez le faire en utilisant le attr_accessor method. Cela vous permettra de créer un attribut pour le modèle qui peut être utilisé pour les validations:

class Widget < ActiveRecord::Base 
    attr_accessor :confirmation_email 
    validates_length_of :confirmation_email, :within => 1..10 
end 

Pour exécuter uniquement la validation à certains moments, vous pouvez utiliser une condition :if:

validates_length_of :confirmation_email, :within => 1..10, :if => Proc.new { |widget| widget.creation_step > 2 }

Vous pouvez également utiliser une méthode de classe, par exemple: :if => :payment_complete. Avec ceux-ci, vous devriez être en mesure d'atteindre la fonctionnalité que vous voulez. Pour autant que je sache, il n'y a pas de manière plus concise.

+0

Essentiellement, je ne construis pas un formulaire directement corrélé au modèle en question. Par exemple, un formulaire d'inscription pourrait incorporer certaines propriétés de l'utilisateur, et certaines propriétés de "jeter" (comme celles que vous pourriez tirer sur une passerelle CC, puis oublier). Si je créais des attributs sur mon modèle d'utilisateur, je devrais toujours fournir ces propriétés pour les validations à passer, alors que je veux seulement valider ces éléments sur ce formulaire unique dans cet emplacement unique. –

+0

J'ai ajouté des informations sur la condition: if, qui pourrait être ce que vous cherchez. –

1

Yehuda Katz a un great explaination de la façon dont vous pouvez utiliser ActiveModel pour rendre une classe arbitraire compatible avec les aides à la forme de Rails. Cela ne fonctionne que si vous êtes sur Rails 3, cependant.

Si vous ne vivez pas sur le bord saignant, regardez Railscasts episode 193, "Tableless Model", qui décrit comment vous pouvez créer une classe qui charrie assez comme ActiveRecord::Base que cela fonctionne avec form_for.