formas de objeto aninhadas
-
25-09-2019 - |
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
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.