私のアプリケーションには、他の 3 つのモデル (user、subject、および student_level) に属するコースモデルがあります (モデルの説明にはhas manyが含まれています)。
コースを作成できるようにするために、コースモデルの 2 つのモデルの外部キーを attr_accessible として宣言しました。
class Course < ActiveRecord::Base
attr_accessible :objectives, :title, :subject_id, :student_level_id
belongs_to :user
belongs_to :subject
belongs_to :student_level
これは、コースを作成するための私の _fields.html.slim ファイルです。
= render 'shared/error_messages', object: f.object
= f.label :title, t("activerecord.attributes.course.title")
= f.text_field :title
= f.label :subject_id, t("activerecord.attributes.subject.title")
= f.collection_select(:subject_id, Subject.all, :id, :title_for_select)
= f.label :student_level_id, t("activerecord.attributes.student_level.title")
= f.collection_select(:student_level_id, StudentLevel.all, :id, :title_for_select)
= f.label :objectives, t("activerecord.attributes.course.objectives")
= f.text_area :objectives, rows: 15, cols: 10
そして、これはcourses_controller.rbの私の新しいメソッドです
#GET /courses/new
def new
@course = current_user.courses.new
# @subjects = Subject.all
# @student_levels = StudentLevel.all
end
上記のコードは、科目と学生レベルの属性を一括割り当てしていることを示しています。
私を悩ませているのは、バージョン 3.2 の Hartl の Ruby on Rails チュートリアル (たとえば、p. 536、リスト 10.7) では、これらの外部キーを保護する必要があることです。また、保護された外部キーの割り当ての例があります。
現在、すべてが正常に機能しています。また、私の config/application.rb には config.active_record.whitelist_attributes = true が含まれています
今、attr_accessibleからsubject_idとstudent_level_idを削除すると(保護されるようになります)、アプリケーションは
ActiveModel::MassAssignmentSecurity::Error in CoursesController#create
Can't mass-assign protected attributes: subject_id, student_level_id
私の質問: 2 つの外部キーを持つエンティティを作成するときのベスト プラクティスは何ですか? 外部キーを大量割り当てのために attr_accessible として公開せずに作成/編集する方法はありますか?
どうもありがとうございました!
アップデート:
#POST /courses/
def create
@course = current_user.courses.new(params[:course])
if @course.save
flash[:success] = t("messages.course_created")
redirect_to @course
else
render 'new'
end
end