5

<%= form_for(:product, :url => {:action => 'update', :id => @product.id})) do |f| %>
  ...
<% end %>

<%= form_for(@product, :url => {:action => 'update', :id => @product.id})) do |f| %>
  ...
<% end %>

まったく同じ ?

4

3 に答える 3

5

ヘルパーには@productform_forより多くの機能が付属しています。

:product入力フィールドのIDと名前にのみ影響します。たとえば、次の形式でテキストが提出されているとします。

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

生成されたhtmlは次のようになります。

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

idおよびのname値は、:product.to_sおよびテキストフィールド名によって決定されます。

一方、を使用する場合、URLはのステータスに従って決定されるため、は必要ありません@product:url@product

  • が新しいレコードの場合@product、URLはに投稿されますcreate
  • それ以外の場合、URLはに投稿されますupdate

また、入力フィールドのIDと名前は@productのクラス名の影響を受けるため、単一のテーブル継承を使用する場合は重要です。入力フィールドの値には、@productの属性値が自動的に割り当てられます。したがって、を使用する@productと、html出力は次のようになります。

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

のクラス@product名がItem、であるとすると、出力は次のように変更されます。

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

:productそしてもちろん、との両方を使用できます@product

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

コントロールは入力ファイルの:product名前とIDを制御し、@productコントロールはURLと入力フィールドの値を制御します。

于 2010-12-14T07:47:46.620 に答える
2

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

たとえば、コントローラーのアクション :new で @product を次のように割り当てる場合:

@product = Product.new

そうすれば、おそらく生成されるフォームに違いはありません。ただし、これを :create アクションで次のようにフォローアップすると、次のようになります。

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

@product インスタンスを保存できない場合は、:new と同じフォームがレンダリングされますが、今回はすべてのフィールドに投稿された値が入力されています。:product を使用した場合、それは不可能でした

于 2010-12-14T07:34:54.810 に答える
1

form_forそれはあなたがそこにいるかなり長いです。あなたの質問への短い答え:@productこれは、多くのオブジェクトを持つことができるリソースに対してどのアクションを実行するかを決定するのに役立ちます。これは、このように聞こえます。:product一方、常に同じアクションに進みupdateます. これは、単一のリソースに最適です。リソースの優れた説明は、Routing Guideにあります。入門ガイドでも説明されています。

あなたの2番目form_forはこれに短縮できます:

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

すべてはルーティングと入門ガイドで説明されています。

また、あなたのプロフィールを見ると、あなたはメルボルン出身です。Ruby on Rails オセアニアのGoogle グループには、全国のミートアップがリストされています。メルボルンでは毎月 1 回開催され、志を同じくする人々に会うために参加したいと思うかもしれません。

于 2010-12-14T08:13:54.040 に答える