Ruby on Rails: "form_for (: product, ...)" и "form_for (@product, ...)" эквивалентны? - PullRequest
5 голосов
/ 14 декабря 2010

Is

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

и

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

точно так же?

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

@product в помощнике form_for поставляется с большим количеством функций.

:product влияет только на идентификатор и имя поля ввода. Например, у вас есть текст в форме:

<%= 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 и именем текстового поля.

Если вы используете @product, :url не требуется, поскольку URL-адрес будет определен в соответствии со статусом @product:

  • если @product является новой записью, URL будет публиковаться в create
  • в противном случае, URL будет публиковаться в update

На идентификатор и имя входного файла влияет имя класса @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 контролирует имя и идентификатор входного файла, а @product контролирует URL и значение поля ввода.

2 голосов
/ 14 декабря 2010

похоже, но не то же самое. Когда вы используете @product, вы можете автоматически заполнять значения в полях формы из экземпляра модели.

Например, если вы в действии: new в вашем контроллере присвойте @product следующим образом:

@product = Product.new

Тогда, вероятно, не будет никакой разницы в сгенерированной форме. Однако, если вы выполните это в себе: создайте действие, подобное этому:

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

Тогда, если он не сможет сохранить экземпляр @product, он отобразит ту же форму, что и в: new, но на этот раз все поля будут заполнены значениями. Это было бы невозможно, если бы вы использовали: product

1 голос
/ 14 декабря 2010

Это довольно долго form_for у вас там.Краткий ответ на ваш вопрос: @product полезен для определения того, какое действие нужно предпринять для ресурса, который может иметь много объектов, как это звучит.:product, с другой стороны, всегда будет выполнять одно и то же действие, update.Это лучше всего использовать для единичных ресурсов.Отличное объяснение ресурсов можно найти в Routing Guide .Это также объясняется в руководстве Getting Started .

Ваш второй form_for может быть сокращен до следующего:

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

Все объясняется в Routing andРуководство по началу работы.

Кроме того, я видел в вашем профиле, что вы из Мельбурна.Существует Ruby on Rails Oceania группа Google, которая перечисляет встречи по всей стране.Каждый месяц в Мельбурне проводится одно собрание, на котором вы можете встретиться с единомышленниками.

...