2011-01-26 3 views
63

J'ai un modèle, et j'ai une vue qui affiche un formulaire pour créer un nouvel objet basé sur ce modèle. Appelons ce formulaire, Form1.Rails 3/Formulaire sans modèle: Comment créer un formulaire qui n'est pas lié à un modèle?

Une fois que l'utilisateur a soumis Form1, l'objet est créé. Je veux ensuite afficher, sur la page suivante, un deuxième formulaire Form2, qui demande à l'utilisateur de cocher différentes options avant que l'objet ne soit sauvegardé dans la base de données.

Mon problème est probablement extrêmement basique. Je ne sais pas comment créer Form2, étant donné qu'il n'est pas lié directement au modèle. Parce que je suis un débutant Rails, je n'ai créé des formes comme suit:

form_for(@object) { |f| ... } 

@object est un objet instancié à partir du modèle

Problème: Je ne crois pas ce genre de code ne fonctionnera pour mes fins ici. Comment puis-je créer Form2, étant donné qu'il ne doit pas être basé sur le modèle @object ou @object?

Quelques détails de mon application:

Le site accepte les valeurs (Form1) avant de rediriger vers un serveur OAuth.

Lorsque l'utilisateur vérifie ses informations d'identification sur le serveur OAuth, elle est redirigée vers mon site. Une demande XML-RPC récupère ensuite des informations sur le compte de l'utilisateur sur le serveur OAuth. La réponse XML peut indiquer que l'utilisateur possède un seul compte sur le serveur OAuth. Si tel est le cas, certaines valeurs sont extraites du XML et ajoutées à l'objet - qui est ensuite (enfin) enregistré dans la base de données - et l'utilisateur est redirigé vers une page de réussite.

Cependant, si la réponse XML indique que l'utilisateur possède plusieurs comptes sur le serveur OAuth, je veux afficher un formulaire (Form2) qui permet à l'utilisateur de sélectionner les comptes sur le serveur OAuth pour associer à mon site. Donc, Form2 demande vraiment à l'utilisateur combien d'objets créer, plutôt que sur les attributs spécifiques d'un objet.

+2

Utiliser form_tag ou d'autres aides de formulaire – apneadiving

+0

Déjà résolu sur: http://stackoverflow.com/q/804313/428813, veuillez regarder un commentaire utile de Sarah –

Répondre

114

Utilisation form_tag au lieu de form_for, utilisez les aides de forme appropriée: text_field_tag au lieu de f.text_field, text_area_tag au lieu de f.text_area, etc.Exemple:

<%= form_tag "/my_controller/update2" do %> 
    <%= text_field_tag "account", "default info" %> 
    <%= submit_tag "Save" %> 
<% end %> 

Le site de l'API Rails a une grande référence à toutes les aides _tag: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

35

À partir de rails3, validations ont été découplé de ActiveRecord de sorte que vous pouvez créer des objets de vanille qui peuvent être utilisés comme validateurs avec les aides de forme:

class Person 
    include ActiveModel::Validations 

    attr_accessor :first_name, :last_name 

    validates_each :first_name, :last_name do |record, attr, value| 
    record.errors.add attr, 'starts with z.' if value.to_s[0] == ?z 
    end 
end 

puis dans votre modèle:

<%= form_for(Person.new) do |f| %> 
... 

C'est un moyen pratique d'obtenir les avantages des aides de formulaire pour des choses comme les formulaires de courrier électronique sans avoir à créer un objet modèle lié à votre schéma.

4

Pour créer un modèle de table moins,

class Person 
    include ActiveModel::Model 

    attr_accessor :first_name, :last_name 

    validates :first_name, :last_name, presence: true 
end 

Alors à votre avis,

<%= form_for(Person.new) do |f| %> 
.... your form .... 
<% end %> 

Une autre solution similaire peut être trouvée à RailsCasts: Active-Model

+0

Merci, [kleopatra] (http://stackoverflow.com/users/203657/kleopatra) pour vos commentaires à ce sujet. J'ai modifié en conséquence. – Lahiru

+0

Il faut aussi [inclure ActiveModel :: Conversion] (http://stackoverflow.com/a/37822674/673826) et définir «persisted?» Comme faux. – mlt

Questions connexes