2015-10-05 76 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的答案之间,我能够得到这个工作 –