我正在创建一个简单的应用来输入和显示相册。我可以创建一个记录(专辑)并为其指定一个艺术家(在艺术家控制器中创建)。我想将轨道添加到记录中,并使用一个控制器(记录控制器)以一种形式(使用简单形式)执行此操作。
这是我的记录模型
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
这是我的记录/ new / 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>
我无法弄清楚为什么名称没有为赛道保存。我哪里错了?任何帮助将不胜感激。
答案 0 :(得分:1)
首先。您的has_many关联名为:tracks
,但在形式和强参数中,您有:record_tracks
,因此您无法通过此表单创建它们。你必须在形式和强大的参数中使用相同的名称作为关联。
二。您在create action中调用@record.tracks.build
,这将构建新的空Track
对象,然后保存在Record中将保存它与父Record
对象一起。不要在创建操作中调用@record.tracks.build
- 它希望从表单传递新数据,而不是创建新的空白。
答案 1 :(得分:0)
您需要在正确的参数散列中传递:name
:
#app/controllers/records_controller.rb
class RecordsController < ApplicationController
def record_params
params.require(:record).permit(:name, :artist_id, tracks_attributes: [:name])
end
end