Schienen 3 / Formular ohne Modell: Wie erstelle ich ein Formular, das nicht an ein Modell gebunden ist?

70

Ich habe ein Modell und eine Ansicht, in der ein Formular zum Erstellen eines neuen Objekts basierend auf diesem Modell angezeigt wird. Nennen wir dieses Formular Form1.

Sobald der Benutzer sendet Form1, wird das Objekt erstellt. Ich möchte dann auf der folgenden Seite ein zweites Formular anzeigen, in dem Form2der Benutzer aufgefordert wird, verschiedene Optionen abzuhaken, bevor das Objekt in der Datenbank gespeichert wird.

Mein Problem ist wahrscheinlich sehr einfach. Ich weiß nicht, wie ich erstellen soll Form2, da es nicht direkt an das Modell gebunden ist. Da ich ein RailsNeuling bin , habe ich nur folgende Formulare erstellt:

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

@object ist ein aus dem Modell instanziiertes Objekt

Problem : Ich glaube nicht, dass diese Art von Code für meine Zwecke hier funktioniert. Wie erstelle ich Form2, da es nicht auf dem Modell von @objectoder basieren darf @object?

Einige Details aus meiner App :

Die Site akzeptiert values ​​( Form1), bevor sie auf einen OAuthServer umgeleitet wird .

Wenn der Benutzer seine Anmeldeinformationen auf dem OAuthServer überprüft , wird er zurück zu meiner Site umgeleitet. Eine XML-RPCAnfrage ruft dann Informationen über das Benutzerkonto auf dem OAuthServer ab.

Die XMLAntwort zeigt möglicherweise an, dass der Benutzer nur ein Konto auf dem OAuthServer hat. In diesem Fall werden einige Werte aus dem XMLObjekt abgerufen und dem Objekt hinzugefügt - das dann (endgültig) in der Datenbank gespeichert wird - und der Benutzer wird auf eine Erfolgsseite umgeleitet.

Wenn die XMLAntwort jedoch angibt, dass der Benutzer mehrere Konten auf dem OAuthServer hat, möchte ich ein Formular ( Form2) anzeigen , mit dem der Benutzer auswählen kann, welche Konten auf dem OAuth-Server meiner Site zugeordnet werden sollen. Form2Der Benutzer wird also wirklich gefragt, wie viele Objekte erstellt werden sollen, und nicht nach bestimmten Attributen eines Objekts.

Morris Singer
quelle
2
Verwenden Sie form_tag oder andere Formularhelfer
apneadiving
Bereits gelöst auf: stackoverflow.com/q/804313/428813 , bitte sehen Sie nützliche Kommentare von Sarah
Ramon Araujo

Antworten:

119

Verwenden Sie form_taganstelle von form_forund verwenden Sie dann die entsprechenden Formular-Helfer: text_field_taganstelle von f.text_field, text_area_taganstelle von f.text_areausw. Beispiel:

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

Die Rails-API-Site enthält einen hervorragenden Verweis auf alle _tag-Helfer: http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html

Dylan Markow
quelle
35

Ab Rails3 wurden Validierungen von ActiveRecord entkoppelt, sodass Sie Vanilleobjekte erstellen können, die als Validatoren mit den Formularhelfern verwendet werden können:

 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

und dann in Ihrer Vorlage:

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

Dies ist eine praktische Möglichkeit, die Vorteile der Formular-Helfer für E-Mail-Formulare zu nutzen, ohne ein an Ihr Schema gebundenes Modellobjekt erstellen zu müssen.

Karl Rosaen
quelle
5

So erstellen Sie ein tabellenloses Modell:

class Person
  include ActiveModel::Model

  attr_accessor :first_name, :last_name

  validates :first_name, :last_name, presence: true
end

Dann aus Ihrer Sicht,

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

Eine andere ähnliche Lösung finden Sie unter RailsCasts: Active-Model

Lahiru
quelle
Man muss auch ActiveModel :: Conversion einschließen und definieren persisted?, dass es falsch ist.
Mlt