2015-10-05 123 views
1

我正在創建一個簡單的應用程序來輸入和顯示相冊。我可以創建一個唱片(專輯)併爲其分配一個藝術家(這是在藝術家控制器中創建的)。我想將軌道添加到記錄中,並使用一個控制器(記錄控制器)以一種形式(使用簡單形式)執行此操作。belongs_to名稱屬性不保存嵌套導軌形式

這裏是我的記錄模式

class Record < ActiveRecord::Base 
    belongs_to :artist 
    has_many :tracks 
    accepts_nested_attributes_for :tracks 

這裏是我的軌道模型

class Track < ActiveRecord::Base 
    belongs_to :record 

這裏的記錄控制器

class RecordsController < ApplicationController 

    def index 
     @records = Record.all 
    end 

    def new 
     @record = Record.new 
    end 

    def create 
     @record = Record.create(record_params) 
     @record.tracks.build 
     @record.save! 
     redirect_to records_path 
    end 

    def record_params 
     params.require(:record).permit(:name, :artist_id, record_tracks_attributes: [:name]) 
    end 

,這裏是我的記錄/新/ html.haml頁

= simple_form_for @record do |f| 
     = f.collection_select(:artist_id, Artist.all, :id, :name, prompt: true) 
     = f.input :name 
     = f.simple_fields_for :record_tracks do |t| 
     = t.input :name 
     = t.button :submit 
    = link_to 'add artist', new_artist_path 

這似乎保存正常,但是當我看到在控制檯中,我得到以下

> Track.last 
     Track Load (0.6ms) SELECT "tracks".* FROM "tracks" ORDER BY  "tracks"."id" DESC LIMIT 1 
     => #<Track id: 20, name: nil, created_at: "2015-10-05 17:30:30", updated_at: "2015-10-05 17:30:30", record_id: 39> 

爲什麼叫不節省了軌道,我不能工作了。我哪裏錯了?任何幫助將不勝感激。

回答

1

首先。您的has_many關聯名爲:tracks,但在表單和強參數中您有:record_tracks,因此您無法通過此表單創建它們。你必須使用與形式和強參數相同的名稱。

二。您在創建動作時會調用@record.tracks.build,該動作將構建新的空物體Track,然後保存在Record上將其與父物體Record一起保存。不要在創建操作中調用@record.tracks.build - 它期望從表單傳遞新數據,而不是創建新的空白。

+0

感謝奧列格!這讓它工作! –

0

你需要通過:name在正確的PARAMS哈希:

#app/controllers/records_controller.rb 
class RecordsController < ApplicationController 
    def record_params 
     params.require(:record).permit(:name, :artist_id, tracks_attributes: [:name]) 
    end 
end 
+1

感謝您的幫助!在你和Oleg的答案之間,我能夠得到這個工作 –