2016-10-03 96 views
1

我很難與這一個。我有一個專輯Model和Track Model,Track屬於專輯,專輯有很多曲目。當我嘗試創建一個音軌(下面的嵌套形式)一張專輯就無法保存和與此消息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(params here)將曲目關聯到它。 – 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

謝謝,它現在有效 –