2010-12-14 12 views

Respuesta

5

El @product en el form_for ayudante se envía con más funciones.

El :product solo afecta la identificación y el nombre del campo de entrada. Por ejemplo, usted tiene un texto presentado en la forma:

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

el código HTML generado se vería así:

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

El valor id y name está determinada por la :product.to_s y el nombre del campo de texto.

Mientras que si se utiliza @product, la :url no es necesario porque la url se determina de acuerdo con la @product 's de estado:

  • si el @product es un nuevo registro, el URL sería enviar a create
  • lo contrario, la URL sería colocar a update

y la entrada de Identificación presentada y el nombre se ve afectada por @product 's cl nombre del asno, por lo que es importante cuando está usando la tabla única heredante. El valor del archivo de entrada se asigna automáticamente con el valor de atributo @product.Así que si usa @product, la salida HTML se vería así:

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

Asumir nombre de la clase del @product 's es Item, entonces la salida cambiaría a:

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

Y, por supuesto, puede utilizar ambos :product y @product:

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

La entrada :product controles presentada el nombre y la identificación, y el @product controla el valor del campo url y de entrada.

+0

: el producto también afecta a la URL que genera 'form_for'. –

+0

Sí, pero nunca utilizo un argumento de símbolo sin asignar el ': url'. En realidad, el símbolo rara vez se usa solo. – Kevin

+0

Cuando uso 'form_for (: product, ...)' Veo los campos de texto rellenos con los valores de '@ product'. Sin embargo, los cuadros de selección obtienen los valores predeterminados (la primera opción). ¿Tienes alguna idea de lo que puede estar mal? Vea también aquí: http://stackoverflow.com/questions/4436267/ruby-on-rails-why-a-select-box-does-not-show-the-current-object-value –

2

Similar, pero no es lo mismo. Cuando utiliza @product tiene la ventaja de poder llenar automáticamente los valores de los campos de formulario desde la instancia del modelo.

Por ejemplo, si en la acción: en su nuevo controlador asignar @product así:

@product = Product.new 

Entonces habrá probablemente no haber ninguna diferencia en el formulario generado. Sin embargo, si sigue esta en ti: crear una acción como esta:

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

Entonces, si no es capaz de guardar la instancia @product, a continuación, va a proporcionar la misma forma como en: nuevo, pero esta vez tiene todo los campos poblados con los valores publicados. Eso no habría sido posible si utilizó: producto

+0

¿Has investigado esto? ': product' para mí toma la forma de la misma ruta:'/products/new'. Lo mismo con la página de edición: '/ products/1/edit'. Estoy confundido con tu respuesta, es todo. Contradice lo que estoy viendo en * mi investigación *. –

+0

Creo que podríamos estar pensando en cosas diferentes. No mencioné ninguna ruta específica, solo describí las diferencias dentro del formulario cuando utilizo los dos escenarios diferentes. El ejemplo de new y create puede haber sido mal colocado en este caso, pero fue solo un ejemplo de cómo podría beneficiarse al usar una instancia en lugar de un símbolo. – DanneManne

+0

': product' también rellena los campos de texto para mí, exactamente como' @ product'. –

1

Eso es bastante largo form_for que tienes allí. La respuesta breve a su pregunta: @product es útil para determinar a qué acción dirigirse para un recurso que puede tener muchos objetos, que es lo que parece. :product por otro lado siempre irá a la misma acción, update. Esto se usa mejor para recursos singulares. Una gran explicación de los recursos se puede encontrar en el Routing Guide. También se explica en la guía Getting Started.

Su segundo form_for Podría haber un cortocircuito derecha a esto:

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

Todo se explica en el enrutamiento y las guías de introducción.

Además, vi en tu perfil que eres de Melbourne. Está el grupo de Google Ruby on Rails Oceania que enumera las reuniones del país. Hay uno cada mes en Melbourne, que es posible que desee asistir para conocer personas con mentalidad similar.

+0

He comprobado el 'FormBuilder' y encontré que es la variable de instancia' @ product' que hace que el símbolo ': product' actúe como un objeto. si cambia el nombre literal de '@ product' por' @ myproduct', el símbolo no generará url, así como tampoco asignará el valor del campo. Entonces, mi opinión es que el símbolo solo se usa para controlar la identificación y el nombre del campo, y debe usarse junto con la opción ': url'. – Kevin