Ruby on Rails:"form_for(:product,...)"和"form_for(@product,...)"是否相同?

Mis*_*hko 5 forms ruby-on-rails form-for ruby-on-rails-3

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

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

完全相同的 ?

Kev*_*vin 5

@productform_for辅助船有更多的功能.

:product只影响输入字段的ID和名称.例如,您在表单中提交了一个文本:

<%= form_for :product, :url => {...}?do |f| %>
  <%= f.text_field :price %>
<% end %>
Run Code Online (Sandbox Code Playgroud)

生成的html看起来像:

<input type="text" id="product_price" name="product[price]" />
Run Code Online (Sandbox Code Playgroud)

idname值由确定:product.to_s和文本字段名.

如果你使用@product,:url则没有必要,因为url将根据@product状态确定:

  • 如果@product是新记录,则网址将发布到create
  • 否则,网址会发布到 update

输入字段的id和名称受到@product类名的影响,所以当你使用单表继承时这很重要.输入字段的值将自动分配给@product属性值.因此,如果您使用@product,html输出将如下所示:

<input type="text" id="product_price" name="product[price]" value="some value" />
Run Code Online (Sandbox Code Playgroud)

假设@product的类名是Item,那么输出将改为:

<input type="text" id="item_price" name="item[price]" value="some value" />
Run Code Online (Sandbox Code Playgroud)

当然,你可以使用:product@product:

<%= form_for :product, @product do |f| %>
Run Code Online (Sandbox Code Playgroud)

:product控制输入申请的名称和ID,以及@product控制URL和输入字段的值.