web-dev-qa-db-fra.com

Rails 3 / Formulaire sans modèle: comment créer un formulaire qui n'est pas lié à un modèle?

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.

Une fois que l'utilisateur soumet Form1, L'objet est créé. Je souhaite ensuite afficher, sur la page suivante, un deuxième formulaire Form2, Qui demande à l'utilisateur de cocher diverses options avant que l'objet ne soit enregistré 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, j'ai uniquement créé des formulaires comme suit:

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

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

Problème: Je ne pense pas que ce type de code fonctionnera à mes fins ici. Comment créer Form2, Étant donné qu'il ne doit pas être basé sur le modèle de @object Ou de @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, il est redirigé 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 n'a qu'un seul compte sur le serveur OAuth. Si tel est le cas, certaines valeurs sont extraites de 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 a plusieurs comptes sur le serveur OAuth, je souhaite afficher un formulaire (Form2) Qui permet à l'utilisateur de sélectionner les comptes sur le serveur OAuth à associer à mon site. Donc Form2 demande vraiment à l'utilisateur combien objets à créer, plutôt que sur les attributs spécifiques d'un objet.

68
Morris Singer

Utilisation form_tag au lieu de form_for, puis utilisez les aides de formulaire appropriées: 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 Rails API a une grande référence à tous les assistants _tag: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

117
Dylan Markow

Depuis Rails3, les validations ont été découplées d'ActiveRecord afin que vous puissiez créer des objets Vanilla qui peuvent être utilisés comme validateurs avec les assistants de formulaire:

 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.

35
Karl Rosaen

Pour créer un modèle sans table,

class Person
  include ActiveModel::Model

  attr_accessor :first_name, :last_name

  validates :first_name, :last_name, presence: true
end

À votre avis,

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

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

5
Lahiru

Si vous cherchez à utiliser SimpleForm, il y a une réponse spécifique pour cela ici form_tag fonctionne-t-il avec Simple_form?

4
Eric Woodruff