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 Form2
der 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 Rails
Neuling 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 @object
oder basieren darf @object
?
Einige Details aus meiner App :
Die Site akzeptiert values ( Form1
), bevor sie auf einen OAuth
Server umgeleitet wird .
Wenn der Benutzer seine Anmeldeinformationen auf dem OAuth
Server überprüft , wird er zurück zu meiner Site umgeleitet. Eine XML-RPC
Anfrage ruft dann Informationen über das Benutzerkonto auf dem OAuth
Server ab.
Die XML
Antwort zeigt möglicherweise an, dass der Benutzer nur ein Konto auf dem OAuth
Server hat. In diesem Fall werden einige Werte aus dem XML
Objekt 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 XML
Antwort jedoch angibt, dass der Benutzer mehrere Konten auf dem OAuth
Server 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. Form2
Der Benutzer wird also wirklich gefragt, wie viele Objekte erstellt werden sollen, und nicht nach bestimmten Attributen eines Objekts.
quelle
Antworten:
Verwenden Sie
form_tag
anstelle vonform_for
und verwenden Sie dann die entsprechenden Formular-Helfer:text_field_tag
anstelle vonf.text_field
,text_area_tag
anstelle vonf.text_area
usw. 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
quelle
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.
quelle
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-Modelquelle
persisted?
, dass es falsch ist.Wenn Sie SimpleForm verwenden möchten, gibt es hier eine spezifische Antwort. Funktioniert form_tag mit Simple_form?
quelle