2016-10-03 17 views
1

私はこれで苦労します。私はアルバムを持っていますモデルとトラックモデル、トラックはアルバムに属し、アルバムは多くのトラックを持っています。私はトラック(以下、ネストされた形)でアルバムを作成しようとすると、このメッセージを表示して「新しい」フォームを保存し、renserに失敗:Rails 5ネストされたフォーム、親は保存されません

1エラーが保存されてからこのアルバムを禁止:トラックアルバムは 必要があります存在

アルバムコントローラー

class Admin::AlbumsController < AdminController  
    def new 
    @album = Album.new 
    @album.tracks.build 
    end 

    def create 
    @album = Album.new(album_params) 

    if @album.save 
     redirect_to admin_album_path(@album) 
    else 
     render 'new' 
    end 
    end 

    private 

    def album_params 
     params.require(:album).permit(:title, :kind, :release, tracks_attributes: [:id, :title, :time, :order]) 
    end 
end 

アルバムモデル

class Album < ApplicationRecord 
    has_many :tracks 
    accepts_nested_attributes_for :tracks 
end 

トラックモデル

class Track < ApplicationRecord 
    belongs_to :album 
end 

<%= form_for [:admin, @album] do |f| %> 

    <% if @album.errors.any? %> 
     <div id="error_explanation"> 
      <h2> 
       <%= pluralize(@album.errors.count, "error") %> prohibited this album from being saved: 
      </h2> 
      <ul> 
       <% @album.errors.full_messages.each do |msg| %> 
       <li><%= msg %></li> 
       <% end %> 
      </ul> 
     </div> 
    <% end %> 

    <h5>Album</h5> 
    <p> 
     <%= f.label :title %><br> 
     <%= f.text_field :title %> 
    </p> 

    <p> 
     <%= f.label :kind %><br> 
     <%= f.text_field :kind %> 
    </p> 

    <p> 
     <%= f.label :release %><br> 
     <%= f.text_field :release %> 
    </p> 
    <br><br><br> 

    <h5>Track</h5> 
    <%= f.fields_for :tracks do |tracks_form| %> 
     <p> 
      <%= tracks_form.label :title %> 
      <%= tracks_form.text_field :title %> 
     </p> 
     <p> 
      <%= tracks_form.label :time %> 
      <%= tracks_form.text_field :time %> 
     </p> 
     <p> 
      <%= tracks_form.label :order %> 
      <%= tracks_form.text_field :order %> 
     </p> 
    <% end %> 

    <%= f.submit class: "waves-effect waves-light btn" %> 

<% end %> 

フォームは、私はトラックがアルバムIDを取得することはできませんので、アルバムが保存されていないと思います。
本当に何が起こるか把握するのに役立つでしょうか?

+0

を試してみてください。それまではデータベースにIDが割り当てられていないことに気づくでしょう!したがって、代わりにアルバムを作成してからalbum.tracks.new(ここのパラメータ)でトラックを関連付けることができます – bkunzi01

+0

コンソールで同じように試しましたか?このモデルの移行を表示できますか? – kunashir

答えて

3

Railsがトラックを保存しようとすると、アルバムはまだデータベースにコミットされていません。この仕事にするために、あなたは を持っている必要があります:

inverse_ofあなたが永続化されていないオブジェクトオフの関係を構築することはできません。この

class Album < ApplicationRecord 
    has_many :tracks, inverse_of: :album 
    accepts_nested_attributes_for :tracks 
end 

class Track < ApplicationRecord 
    belongs_to :album, inverse_of: :tracks 
    validates_presence_of :album 
end 
+0

ありがとう、それは今働きます –

関連する問題