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.
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
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.
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
Si vous cherchez à utiliser SimpleForm, il y a une réponse spécifique pour cela ici form_tag fonctionne-t-il avec Simple_form?