68 votes

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

J'ai un modèle et une vue qui affiche un formulaire de création d'un nouvel objet basé sur ce modèle. Appelons ce formulaire, Form1 .

Une fois que l'utilisateur a soumis Form1 l'objet est créé. Je souhaite ensuite afficher, sur la page suivante, un second formulaire Form2 qui demande à l'utilisateur de cocher différentes 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 directement lié au modèle. Comme je suis un Rails débutant, je n'ai créé que les formulaires suivants :

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

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

Problème : Je ne pense pas que ce type de code soit adapté à mes objectifs. Comment puis-je créer Form2 étant donné qu'il ne doit pas être fondé sur @object o @object Quel est le modèle de l'entreprise ?

Quelques éléments spécifiques de mon application :

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

Lorsque l'utilisateur vérifie ses informations d'identification sur la page OAuth elle est redirigée vers mon site. Une XML-RPC récupère ensuite les informations relatives au compte de l'utilisateur sur le site Web du OAuth serveur.

En XML peut indiquer que l'utilisateur n'a qu'un seul compte sur le site web de l OAuth serveur. Si c'est le cas, certaines valeurs sont extraites de la base de données du XML et ajouté à l'objet - qui est alors (enfin) sauvegardé dans la base de données - et l'utilisateur est redirigé vers une page de succès.

Toutefois, si le 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 du serveur OAuth à associer à mon site. Ainsi, l'utilisateur peut choisir les comptes du serveur OAuth qu'il souhaite associer à mon site. Form2 demande réellement à l'utilisateur combien des objets à créer, plutôt que des attributs spécifiques d'un objet.

117voto

Dylan Markow Points 65796

Utilisation form_tag au lieu de form_for puis utiliser les aides au 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 de l'API Rails contient une excellente référence à toutes les aides _tag : http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

35voto

Karl Rosaen Points 2096

A partir de rails3, les validations ont été découplées d'ActiveRecord afin que vous puissiez créer des objets vanille qui peuvent être utilisés comme validateurs avec les aides 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 de bénéficier des avantages des aides au formulaire pour des choses telles que les formulaires de courrier électronique sans avoir à créer un objet de modèle lié à votre schéma.

5voto

Lahiru Points 1331

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

Alors, selon vous,

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

Une autre solution similaire peut être trouvée à l'adresse suivante RailsCasts : Modèle actif

4voto

Eric Woodruff Points 1886

Si vous souhaitez utiliser SimpleForm, vous trouverez ici une réponse spécifique à ce sujet. form_tag fonctionne-t-il avec Simple_form ?

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