Pergunta

eu tenho um 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%>

Ele gera o código html sem campos_for função

<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>

Quando eu mudar o formulário para:

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

apenas funciona bem. E produz:

<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 eu quero. Por que o símbolo em form_ para funcionar bem? Qual é a diferença entre: a e @a em form_for. Obrigado. Eu uso Rails 2.3.8, Ruby 1.8.7, navegador da Web Chrome.

Foi útil?

Solução

Esta é uma fonte comum de frustração. form_for Na verdade, se comporta de maneira diferente, com base no fato de você passar um símbolo ou um objeto. Se você passar por um símbolo, assim:

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

Em seguida, o construtor de formulários funcionará, mas configurará apenas os valores dos parâmetros e carregará os valores padrão se houver @person. Seu hash parmas parecerá que deveria:

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

Mas não configurará sua rota corretamente. Ele assumirá que você deseja enviar para a mesma página em que já está. Agora, se você der um objeto, form_for fará muito mais por você. Ele verificará se esse objeto é novo ou sendo atualizado e definirá os parâmetros da tag do formulário de acordo, juntamente com alguns outros benefícios.

Honestamente, eu não posso te dizer Por quê Eles se comportam de maneira diferente. A versão de símbolo obviamente ainda tem acesso à variável de instância (@person no exemplo acima) porque os campos serão preenchidos com seus valores existentes. A solução fácil é que passar uma variável de instância é sempre o caminho a seguir e funcionará corretamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top