Pregunta

Tengo un código form_for

<%form_for :a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>
.....
<%f.fields_for :b do |b|%>
.....
<%b.fields_for :apples  do |apple|%>
...
<%end%>
....
<%end%>

emite el código HTML sin campos_for función

<textarea cols="40" id="a_b_apples_content" name="a[b][apples][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>

Cuando cambio el formulario a:

<%form_for @a,:url=>{:controller=>"biz/a",:action=>"save"},:html =>{:multipart => true} do |f| %>

Simplemente funciona bien. Y sale:

<textarea cols="40" id="a_b_apples_content" name="a[b_attributes][apples_attributes][0][content]" rows="20" style="width:500px;height:100px;border:1px #889BAA solid;color:#999;font-size:12px;padding:6px;"></textarea>

como yo quiera. ¿Por qué el símbolo no funciona bien? ¿Cuál es la diferencia entre: a y @a en form_for. Gracias. Utilizo Rails 2.3.8, Ruby 1.8.7, Chrome Web Browser.

¿Fue útil?

Solución

Esta es una fuente común de frustración. form_for En realidad se comporta de manera diferente en función de si lo pasa un símbolo o un objeto. Si lo pasa un símbolo, así:

<% form_for :person do |f| %>
  <% f.text_field :name %>
<% end %>

Luego, el constructor de formulario funcionará, pero solo configurará los valores de Param y cargará los valores predeterminados si @Person existe. Su hash de parmas se verá como debería:

params = {
  :person => {
    :name => 'bob'
  }
}

Pero no configurará su ruta correctamente. Asumirá que desea enviar a la misma página en la que ya está. Ahora si le das un objeto, form_for hará mucho más por ti. Verificará si este objeto es nuevo o se actualiza, y establecerá los parámetros de la etiqueta del formulario en consecuencia, junto con algunos otros beneficios.

Honestamente, no puedo decirte por qué se comportan de manera diferente. La versión del símbolo obviamente todavía tiene acceso a la variable de instancia (@Person en el ejemplo anterior) porque los campos estarán poblados con sus valores existentes. La solución fácil es que pasar una variable de instancia es siempre el camino a seguir y funcionará correctamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top