belongs_to Name属性不以嵌套的rails形式保存

时间:2015-10-05 17:51:10

标签: ruby-on-rails associations

我正在创建一个简单的应用来输入和显示相册。我可以创建一个记录(专辑)并为其指定一个艺术家(在艺术家控制器中创建)。我想将轨道添加到记录中,并使用一个控制器(记录控制器)以一种形式(使用简单形式)执行此操作。

这是我的记录模型

    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>

我无法弄清楚为什么名称没有为赛道保存。我哪里错了?任何帮助将不胜感激。

2 个答案:

答案 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