2017-09-05 5 views
1

Ich habe die Modelle seriesseasons und episodes. Von innerhalb series/new Formular Ich möchte eine Serie, Staffel und Folge alle zusammen erstellen. Ich lese Rails Routing und Nested Forms Führer, aber ich weiß nicht, was ich falsch mache, da der Führer eine 3-stufige Tiefe nicht deckt. Bei Verwendung des verschachtelten Formulars fügt Rails nur die Werte Series und Season Werte , aber nicht die Episode Werte ein.Rails verschachtelte Attribute 3 Stufentiefe

Ist mein Ansatz sogar richtig? Ich würde schätzen jede Eingabe ~

# series.rb 
has_many :seasons, dependent: :destroy 
has_many :episodes, :through => :seasons 
accepts_nested_attributes_for :seasons 
accepts_nested_attributes_for :episodes 

# season.rb 
belongs_to :series 
has_many :episodes, dependent: :destroy 

# episode.rb 
belongs_to :season 

# routes.rb 
resources :series, except: [:show, :new] do 
    resources:seasons, except: [:show], path: '' do 
    resources :episodes, path: '' 
    end 
end 

Serie/new.html.erb

<%= form_for @series do |f| %> 
    <%= f.text_field :title %> 
    <%= f.fields_for :seasons do |seasons_form| %> 
     <%= seasons_form.text_field :title %> 
     <%= seasons_form.fields_for :episodes do |episodes_form| %> 
     <%= episodes_form.text_field :title %> 
     <% end %> 
    <% end %> 
    <% end %> 
+0

Erhalten Sie episods Attribute in Params-Hash? Wenn ja, hast du dann die Attribute der Episode auf die weiße Liste gesetzt? –

+0

Danke für die Antwort, das ist mein series_params: 'def series_params params.require (: person) .permit (: titel, jahreszeiten_attribute: [: id,: titel], episoden_attributes: [: id,: titel]) ende ' – Dotol

Antwort

0

Sie benötigen, da die Jahreszeiten Form accepts_nested_attributes_for :episodes aus dem Serienmodell in die Saison-Modell zu bewegen, <%= seasons_form.fields_for :episodes ... %> ist die Annahme Attribute Ersetzen Sie für die episodes

+0

Das würde eine undefinierte Methode 'Episoden' in meine Build-Anweisung werfen. – Dotol

1

# series.rb 
has_many :seasons, dependent: :destroy 
accepts_nested_attributes_for :seasons 
accepts_nested_attributes_for :episodes 

mit

# series.rb 
has_many :seasons, dependent: :destroy 
has_many :episodes, :through => :seasons 
accepts_nested_attributes_for :seasons 
accepts_nested_attributes_for :episodes 
+0

Das macht Sinn eigentlich kann ich nicht glauben, dass ich daran dachte, ein wenig einchecken, sobald ich Zugang zu einem Computer habe. – Dotol

+1

Dieser [code] (https://github.com/rails/rails/blob/d0d7ce001bdbb0e5551da881caf8156c06238b84/activerecord/lib/active_record/nested_attributes.rb) zeigt, wie die Schienen 'accepts_nested_attributes_for' definiert haben. wenn 'wenn Reflexion = _reflect_on_association (association_name)' Null ist, 'Argument erhöhen "Keine Zuordnung für Namen gefunden \ '# {association_name}‘. Ist es noch definiert?"' aufgetreten. – kansiho

+0

Danke @ Aoi_777 Ich aktualisierte den ursprünglichen Beitrag zu weiteren Details, wie Episoden nicht gespeichert werden – Dotol

1

series.rb

has_many :seasons, dependent: :destroy 
has_many :episodes, :through => :seasons 

accepts_nested_attributes_for :seasons 
accepts_nested_attributes_for :episodes 

season.rb

belongs_to :series 
has_many :episodes, dependent: :destroy 

accepts_nested_attributes_for :episodes 

episode.rb

belongs_to :season 

Wie Sie has_many :episodes, :through => :seasons verwendet haben, Episoden Parameter innen sein die hash von seasons. Sie müssen also eine geringfügige Änderung in series_params Methode machen:

Serie Controller

def new 
    @series = Series.new 
    #build objects of nested 
    @season = @series.seasons.build 
    @episod = @season.episods.build 
end 

def series_params 
    params.require(:series).permit(:title, 
    seasons_attributes: [:id, :title, episodes_attributes: [:id, :title]]) 
end 

Hinweis: Es ist statisch. Für dynamische Objektbildung, hier ist eine gute screencast

+0

Ich tat genau das und es speichert immer noch keine Episoden das sind meine Params und Form Buchstabe für Buchstabe: def series_params 'params.require (: series) .permit (: title, seasons_attributes: [: id,: titel, episoden_attributes: [: id,: titel]]) ende' – Dotol

+0

Und meine form: '<% = form_for @series do | f | %> <% = f.text_field: title%> <% = f.fields_for: Jahreszeiten | ff | %> <% = ff.text_field: title%> <% = ff.fields_for: Folgen tun | fff | %> <% = fff.text_field: title%> <% end %> <% end %> <% = f.submit%> <% end %> ' – Dotol

+1

können Sie Ihre Eingabe params-Hash posten? Sie können es im Serverprotokoll finden, wenn Sie das Formular absenden. –

Verwandte Themen