1

私のアプリケーションには、他の 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
4

1 に答える 1

0

コースフォームのコードを見ると、ユーザーからのみを介しmy _fields.html.slimて取得しているように見えるため、アクセスできるはずです。subject_id, student_level_idselect box

保護する必要があるのは、たとえば、Instituemodelがありcourse、 an に属しInstitueforeign_keyasがあるinstitute_id場合、これinstitute_idを保護する必要があるとします。

私があなたに与えることができる他の例は、言う

Project属しUserUserおり、多くのprojects

user_idそして、テーブルに外部キーがありprojectsます:

次に、プロジェクトの作成中に次のようなことを行う必要があります。

#This will create a new project object with user_id set as id of current_user
current_user.projects.new 

params を使用してプロジェクト オブジェクトを作成するには、次のようにします。

current_user.projects.new(params[:project])

2つの保護された属性を持つオブジェクトを作成する方法は確かではありませんが、あなたの場合、属性subject_id, student_level_idは保護されるべきではありません。

于 2013-10-11T11:17:51.710 に答える