web-dev-qa-db-ja.com

Rails 3 /モデルのないフォーム:モデルに関連付けられていないフォームを作成するにはどうすればよいですか?

モデルがあり、そのモデルに基づいて新しいオブジェクトを作成するためのフォームを表示するビューがあります。そのフォームを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は、オブジェクトの特定の属性についてではなく、作成するオブジェクトを実際にユーザーに要求しますいくつ]。

68
Morris Singer

つかいます form_tag の代わりに form_for、次に適切なフォームヘルパーを使用します:text_field_tag の代わりに f.text_fieldtext_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

117
Dylan Markow

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| %>
...

スキーマに関連付けられたモデルオブジェクトを作成せずに、電子メールフォームなどのフォームヘルパーの利点を得る便利な方法です。

35
Karl Rosaen

テーブルレスモデルを作成するには、

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

5
Lahiru

SimpleFormを使用する場合は、具体的な答えがここにあります form_tagはSimple_formで動作しますか?

4
Eric Woodruff