5

Obecnie Przedmiotbelongs_toSpółka i has_manyItemVariants.mnoga fields_for stowarzyszenia has_many nie pokazuje w widoku

Próbuję użyć zagnieżdżonych fields_for do dodania pól ItemVariant poprzez formularz Item, jednak używając: item_variants nie wyświetla formularza. Jest wyświetlany tylko wtedy, gdy używam liczby pojedynczej.

Sprawdziłem moje powiązania i wydaje się, że są poprawne, czy może mieć coś wspólnego z pozycją zagnieżdżoną w Kompanii, czy też brakuje mi czegoś innego?

Z góry dziękuję.

Uwaga: w poniższych opisach pominięto kod nieodpowiedni.

EDYCJA: Nie wiem, czy to jest istotne, ale używam CanCan do uwierzytelniania.

routes.rb

resources :companies do 
    resources :items 
end 

item.rb

class Item < ActiveRecord::Base 
    attr_accessible :name, :sku, :item_type, :comments, :item_variants_attributes 


    # Associations 
    #----------------------------------------------------------------------- 
    belongs_to :company 
    belongs_to :item_type 
    has_many :item_variants 

    accepts_nested_attributes_for :item_variants, allow_destroy: true 

end 

item_variant.rb

class ItemVariant < ActiveRecord::Base 
    attr_accessible :item_id, :location_id 

    # Associations 
    #----------------------------------------------------------------------- 
    belongs_to :item 

end 

poz/new.html.erb

<%= form_for [@company, @item] do |f| %> 
    ... 
    ... 
    <%= f.fields_for :item_variants do |builder| %> 
    <fieldset> 
     <%= builder.label :location_id %> 
     <%= builder.collection_select :location_id, @company.locations.order(:name), :id, :name, :include_blank => true %> 
    </fieldset> 
    <% end %> 
    ... 
    ... 
<% end %> 

Odpowiedz

6

należy wstępnie wypełnić @item.item_variants z niektórych danych:

def new # in the ItemController 
    ... 
    @item = Item.new 
    3.times { @item.item_variants.build } 
    ... 
end 

Źródło: http://rubysource.com/complex-rails-forms-with-nested-attributes/

+1

Dzięki! Działa perfekcyjnie, ale jako punkt odniesienia wykorzystałem poprawioną wersję RailsCast ep 196-Nested-model-. W jego nowej akcji zawierało tylko '@survey = Survey.new' bez budowania powiązania. Każdy pomysł, dlaczego muszę zbudować stowarzyszenie, a Ryan tego nie zrobił? – 8bithero

+1

To railscast jest jeszcze lepsze, choć złożone, ponieważ może dynamicznie dodawać pytania w formularzu ankiety. Więc nie trzeba niczego wstępnie wypełniać. – rewritten

+0

Chciałem tylko dodać pewne znaczenie dla tych, którzy są zdezorientowani z powodu .build i dlaczego Ryans "nie potrzebował tego. Jeśli spojrzysz na jego kod w appliation_helper na linii 3, to utworzysz instancję klasy. Tak więc zajmuje miejsce .build. Mam nadzieję, że to pomoże każdemu, kto tam jest! –

2

spróbować w ten sposób

w item controllernew action zapisu

def new 
    ... 
    @item = # define item here 
    @item.item_variants.build if @item.item_variants.nil? 
    ... 
end 

aw item/new.html.erb

<%= form_for @item do |f| %> 
    ... 
    ... 
    <%= f.fields_for :item_variants do |builder| %> 
    ... 
    <% end %> 
    ... 
    ... 
<% end %> 

dla więcej zobacz video - Nested Model Form

+0

Dzięki. Działa to, ale użycie '@item.item_variants.build if @ item.item_variants.nil? 'Nie zadziałało. Działa tylko wtedy, gdy usunę instrukcję if. Używanie tej Poprawionej wersji twojego linku było tym, co mnie zdezorientowało. W swoim kontrolerze nie używa .build. Tworzy tylko instancję @survey. Każdy pomysł, dlaczego muszę zbudować stowarzyszenie, a Ryan tego nie zrobił? – 8bithero

Powiązane problemy