Rails 5 中 accepts_nested_attributes_for 不起作用。
如果你在 Rails 5 中使用 accepts_nested_attributes_for 并且是 has_many 的关系,那么你可能需要使用 inverse_of 这个选项。
具体见下面实例
有三个 model 分别为 course, section 与 assignments。
class Course < ApplicationRecord
  has_many :sections, dependent: :destroy
  has_many :assignments, through: :sections
end
class Section < ApplicationRecord
  belongs_to :course
  has_many :assignments, dependent: :destroy
  accepts_nested_attributes_for :assignments, allow_destroy: true
end
class Assignment < ApplicationRecord
  belongs_to :section
end
class Admin::SectionsController < ApplicationController
  before_action :authenticate_user!
  before_action :admin_required
  def new
    @course = Course.find(params[:course_id])
    @section = @course.sections.new
    @section.assignments.build
  end
  def create
    @section = Section.new(section_params)
    @course = Course.find(params[:course_id])
    @section.course_id = @course.id
    if @section.save
      redirect_to admin_course_sections_path(@course)
    else
      render :new
    end
  end
  private
  def section_params
    params.require(:section).permit(:title, :content, :course_id,
                  assignments_attributes: [:id, :title, :content, :_destroy])
  end
end
一直未能成功添加 assignments
后来加上了 inverse_of 之后,马上可以了。
class Section < ApplicationRecord
  belongs_to :course
  has_many :assignments, dependent: :destroy, inverse_of: :section
  accepts_nested_attributes_for :assignments, allow_destroy: true
end