2017-09-05 3 views
1

私はモデルseriesseasonsepisodesを持っています。 series/newフォームから、シリーズ、シーズン、そしてエピソードをまとめてみたい。私はRails RoutingNested Formsガイドを読んでいますが、私はガイドが3レベルの深さをカバーしていないので、私が間違っていることはわかりません。ネストされたフォームを使用する場合、RailsはSeriesSeasonという値を挿入しますが、Episodeの値はではありません。Railsネストされた属性3レベルの深さ

私のアプローチは正しいですか?私は<%= seasons_form.fields_for :episodes ... %>属性を受け入れている、あなたは季節のフォームので、シーズンモデルにシリーズモデルからaccepts_nested_attributes_for :episodesを移動する必要がある任意の入力〜

# 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 

シリーズ/ 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

params hashにepisodの属性がありますか?はいの場合、あなたはエピソードの属性をホワイトリストに入れましたか? –

+0

返信ありがとうございます、これは私のseries_params: 'def series_params params.require(:person).permit(:title、seasons_attributes:[:id、:title]、episodes_attributes:[:id、:title])です。 end ' – Dotol

答えて

0

をいただければと思いますepisodes

+0

ビルドステートメントに未定義のメソッド 'episodes'がスローされます。 – Dotol

1

のために交換してください

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

これは実際には私がコンピュータにアクセスしたら、ちょっと調べて、それを考えたとは思えません。 – Dotol

+1

この[code](https://github.com/rails/rails/blob/d0d7ce001bdbb0e5551da881caf8156c06238b84/activerecord/lib/active_record/nested_attributes.rb)は、どのように 'accepts_nested_attributes_for'を定義したかを示しています。 'if reflection = _reflect_on_association(association_name)'がnilの場合、 'raise ArgumentError '、名前\'#{association_name}'の関連付けが見つかりませんでした。 – kansiho

+0

ありがとうございます@ Aoi_777元の投稿を更新して、どのようにエポデスが保存されていないのかを詳細に確認しました。 – 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 

あなたがhas_many :episodes, :through => :seasonsを使用してきたように、エピソードのパラメータは内部になりますとhashseasonsです。

シリーズコントローラ

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 

注:だからseries_params方法に若干の変更を加える必要がありそれは静的です。動的オブジェクト構築の場合、ここには良いですscreencast

+0

私はそれを正確に行いましたが、これは私のparamsでありレターで手紙形式のエポを保存しません:def series_params 'params.require :<%= form_for @series do | f |:series).permit(:title、seasons_attributes:[:id、:タイトル、エピソード属性:[:id、:タイトル]] end' – Dotol

+0

%> <%= f.text_field:title%> <%= f.fields_for:seasons do | ff | %> <%= ff.text_field:title%> <%= ff.fields_for:エピソードは| fff | %> <%= fff.text_field:タイトル%> <% end %> <% end %> <%= f.submit%> <% end %> ' – Dotol

+1

、あなたの入力のparamsハッシュを投稿することができますか?フォームを提出すると、サーバーログに表示されます。 –

関連する問題