モデルがあり、そのモデルに基づいて新しいオブジェクトを作成するためのフォームを表示するビューがあります。そのフォームをForm1
と呼びましょう。
ユーザーがForm1
を送信すると、オブジェクトが作成されます。次に、次のページに2番目のフォームForm2
を表示します。このフォームは、オブジェクトがデータベースに保存される前にさまざまなオプションをオフにするようにユーザーに要求します。
私の問題はおそらく非常に基本的なものです。 Form2
を作成する方法がわかりません。モデルに直接結び付けられていないためです。私はRails
初心者なので、次のようなフォームのみを作成しました。
form_for(@object) { |f| ... }
@object
はモデルからインスタンス化されたオブジェクト
問題:この種のコードがここでの私の目的に役立つとは思わない。 Form2
または@object
のモデルに基づいてはならない場合、どのように@object
を作成しますか?
私のアプリのいくつかの詳細:
サイトは、OAuth
サーバーにリダイレクトする前に値(Form1
)を受け入れます。
ユーザーがOAuth
サーバーで資格情報を確認すると、ユーザーは私のサイトにリダイレクトされます。 XML-RPC
リクエストは、OAuth
サーバー上のユーザーのアカウントに関する情報を取得します。
XML
応答は、ユーザーがOAuth
サーバーにアカウントを1つだけ持っていることを示す場合があります。その場合、いくつかの値がXML
から取得され、オブジェクトに追加され(最終的にはデータベースに保存され)、ユーザーは成功ページにリダイレクトされます。
ただし、XML
応答が、ユーザーがOAuth
サーバーに複数のアカウントを持っていることを示している場合、ユーザーがどのアカウントを選択できるかを示すフォーム(Form2
)を表示したいOAuthサーバーは私のサイトに関連付けます。したがって、Form2
は、オブジェクトの特定の属性についてではなく、作成するオブジェクトを実際にユーザーに要求しますいくつ]。
つかいます form_tag
の代わりに form_for
、次に適切なフォームヘルパーを使用します:text_field_tag
の代わりに f.text_field
、text_area_tag
の代わりに f.text_area
など。例:
<%= form_tag "/my_controller/update2" do %>
<%= text_field_tag "account", "default info" %>
<%= submit_tag "Save" %>
<% end %>
Rails APIサイトには、すべての_tagヘルパーへの優れたリファレンスがあります。 http://api.rubyonrails.org/classes/ActionView/Helpers/FormTagHelper.html
Rails3からは、検証がActiveRecordから分離されているため、フォームヘルパーでバリデーターとして使用できるVanillaオブジェクトを作成できます。
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
そしてテンプレートで:
<%= form_for(Person.new) do |f| %>
...
スキーマに関連付けられたモデルオブジェクトを作成せずに、電子メールフォームなどのフォームヘルパーの利点を得る便利な方法です。
テーブルレスモデルを作成するには、
class Person
include ActiveModel::Model
attr_accessor :first_name, :last_name
validates :first_name, :last_name, presence: true
end
次に、あなたの見解では、
<%= form_for(Person.new) do |f| %>
.... your form ....
<% end %>
別の同様のソリューションはRailsCasts
で見つけることができます: Active-Model
SimpleFormを使用する場合は、具体的な答えがここにあります form_tagはSimple_formで動作しますか?