2010-12-14 16 views

答えて

5

form_for@productヘルパーが多くの機能を備えています。

:productは、入力フィールドのIDと名前にのみ影響します。

<%= form_for :product, :url => {...} do |f| %> 
    <%= f.text_field :price %> 
<% end %> 

生成されたHTMLは次のようになります:

<input type="text" id="product_price" name="product[price]" /> 

idname値は:product.to_sとテキストフィールド名によって決定されますたとえば、フォームで提出されたテキストを持っています。

あなたが@productを使用する場合のURLは@productの状況に応じて決定されるため、:urlは必要ありませんが:

  • @productが新しいレコードである場合、URLはcreate
  • に投稿します
  • そうでない場合は、URLがupdate

に投稿するだろうし、入力の提出IDと名前が@productのCLの影響を受けていますお尻の名前なので、単一のテーブルの継承を使用している場合は重要です。入力フィールドの値は、@productの属性値で自動的に割り当てられます。あなたが@productを使用するのであれば、HTML出力は次のようになります。

<input type="text" id="item_price" name="item[price]" value="some value" /> 

そしてもちろん、あなたが使用することができます。

<input type="text" id="product_price" name="product[price]" value="some value" /> 

@productのクラス名がItemで、出力はに変化するであろうと想定し:product@productの両方:

<%= form_for :product, @product do |f| %> 

提出:product制御入力の名前とID、および@productはURLと入力フィールドの値を制御します。

+0

:製品は 'form_for'が生成するURLにも影響します。 –

+0

ええ、私は ':url'を代入せずにシンボル引数を使うことはありません。実際にはシンボルはほとんど使われません。 – Kevin

+0

'form_for(:product、...)'を使用すると、 '@ product'の値が入力されたテキストフィールドが表示されます。ただし、選択ボックスはデフォルト値を取得します(最初のオプション)。何が間違っているかも考えていますか?こちらもご覧ください:http://stackoverflow.com/questions/4436267/ruby-on-rails-why-a-select-box-does-not-show-the-current-object-value –

2

類似していますが、同じではありません。 @productを使用すると、モデルインスタンスのフォームフィールドに自動的に値を入力できるという利点があります。例えば

、あなたのアクションであれば:新しいあなたのコントローラでは、このよう@product割り当てる:

@product = Product.new 

そして、おそらく、生成されたフォームの違いがありません。 、あなたはあなたの中にこれをフォローアップしかし:それは@productインスタンスを保存することができない場合は次に、それはと同じフォームをレンダリングします

@product = Product.new(params[:product]) 
if @product.save 
    ... 
else 
    render :action => :new 
end 

:このようなアクションを作成して新しいが、今回はすべて持っていますフィールドには転記された値が入力されます。あなたが使用した場合、それは可能ではありませんでした:製品

+0

これは調査しましたか? ':product'は私のために'/products/new'という同じルートにフォームをとります。編集ページ: '/ products/1/edit'と同じです。私はちょうどあなたの答えと混乱している、すべてです。私の研究*で実際に見ていることと矛盾します。 –

+0

私たちはさまざまなことを考えていると思います。私は特定のルートについて言及しなかった、私は2つの異なるシナリオを使用するときにフォーム内の違いのみを説明した。このケースでは、newとcreateの例が不適切な場合がありますが、シンボルの代わりにインスタンスを使用することでどのように利益を得られるかの例に過ぎません。 – DanneManne

+0

':product'は' @ product'と全く同じように、私のためのテキストフィールドにも値を設定します。 –

1

これはあなたが持っているかなり長いform_forです。あなたの質問への短い答え:@productは、多くのオブジェクトを持つことができるリソース、つまりこれが聞こえるようなものに対して、どのようなアクションをとるべきかを判断するのに便利です。一方、:productは常に同じアクションになりますupdate。これは、単数のリソースに最適です。リソースの詳細な説明はRouting Guideにあります。また、Getting Startedガイドで説明しています。

あなたの二form_forは、右下これに短絡することができます。

<%= form_for @product do |f| %> 
    ... 
<% end %> 

すべてのルーティングに説明されているとガイドをはじめ。

また、メルボルン出身のあなたのプロフィールを見ました。全国の集まりをリストアップしているRuby on Rails Oceania Googleグループがあります。メルボルンには毎月1つずつあり、気になる人たちと出会うために出席したいかもしれません。

+0

私は 'FormBuilder'をチェックし、' @ product'インスタンス変数であることがわかりました。シンボル ':product'はオブジェクトとして動作します。 '@ product'のリテラル名を' @myproduct'に変更すると、シンボルはフィールド値を割り当てるだけでなく、URLの生成に失敗します。ですから、私の意見では、シンボルはフィールドのIDと名前を制御するためにのみ使用され、 ':url'オプションと共に使用されるべきです。 – Kevin