Pergunta

Eu sou um trilhos e rubi noob, e tenho certeza de que algo está completamente estúpido que estou perdendo ..

Tentando construir uma forma aninhada e encontrar muitos exemplos on -line e tentaram e não reproduziram o resultado desejado.

Os campos "vendedores" nem sequer são exibidos e, quando eu envio o formulário, recebo:

Atributo desconhecido: item

Modelos:

class Dealerform < ActiveRecord::Base
 belongs_to :dealer
 has_one :seller :class_name => 'Seller'
 has_many :items, :through => :seller
 accepts_nested_attributes_for :seller, :items

end

class Seller < ActiveRecord::Base
 belongs_to :dealerform
 has_many :items :class_name => 'Item'
end

class Item < ActiveRecord::Base
 belongs_to :seller
end

Visão:

<% form_for(@dealerform) do |f| %>
<%= f.error_messages %>
 <p>
 <%= f.label :date %><br />
 <%= f.datetime_select :date %>
 </p>
      #...more fields ...

<% f.fields_for :seller do |seller| %>

<p>
 <%= seller.label :fname %><br />
 <%= seller.text_field :fname %>
</p>
      #...more fields ...

<% end %>

 <% f.fields_for :item do |item| %>
  <p>
   <%= item.label :foo %><br />
   <%= item.text_field :foo %>
  </p>
      #...more fields ...

 <% end %>

<%= f.submit 'Create' %> 
<% end %>

Com base em sugestões .. mudou as seguintes linhas:

<% f.fields_for :seller do |seller| %>
<% f.fields_for :item do |item| %>

para:

<% f.fields_for @seller do |seller| %>
<% f.fields_for @item do |item| %>

E agora eles aparecem no formulário e, ao tentar enviar o formulário, recebo:

Atributo desconhecido: nil_class

Quando eu mudo:

def new
  @dealerform = Dealerform.new

para:

def new
  @dealerform = Dealerform.new
  @dealerform.seller.build

Eu recebo:

Método indefinido `Build 'para Nil: Nilclass

Foi útil?

Solução

É porque o fields_for O atributo exibirá apenas recursos que existem. No seu controlador, você precisa criar objetos para que os formulários contenham.

Então, em seu controlador

def new
    #2.times {@dealer_form.items}
    @dealer_form = DealerForm.new
    @dealer_form.seller = Seller.new
    #or @dealer_form.seller.build
end 

Outras dicas

Parece que o seu modelo de revendedor tem itens, mas seus campos_for estão enviando um item singular; portanto, quando tenta inicializar seu revendedor na ação Criar, está tentando atribuir o revendedor.item, mas não existe esse método. Se um revendedor tiver muitos itens, você pode querer conferir este exemplo http://media.pragprog.com/titles/fr_arr/multiple_models_one_form.pdf Para como gerenciar o Has_Many em um único formulário.

Como Sam indicou, você não tem um objeto real, seja novo ou existente:

f.fields_for @seller

Você pode ter @seller de várias maneiras diferentes, usando build Para criar um novo, ou se você estiver editando um registro existente, use @dealerform.seller.

No caso de itens, pode ser necessário fazer um loop sobre vários, dependendo de quantos formas você deseja exibir. Verificação de saída http://www.railscasts.com Para alguns screencasts sobre isso.

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