これは、2段階のプロセス(私が推奨する方法)で行うことも、1ステップで行うこともできます。
2段階のプロセス: - CourseLocation
を作成 - CourseLocation
とCourse
を関連付けます。
course_location1 = CourseLocation.create(name: 'location1')
course.course_locations << course_location1
あなたはそれがアクティブレコードaccepts_nested_attributes_for
methodを使用して可能である1つのステップでこれを実行したい場合は、これは少しトリッキーです。ここgood articleはそれにあるが、のは、手順を打破してみましょう:
- コースはコースの局在化はコースを作成する場合は、course_location
- の属性を受け入れる属性を渡す必要がcourse_localizations
- の属性を受け入れる必要があります場所の属性を含むローカライゼーションのためのものです。
あなたの特定のケースのためにすべてのことを設定できます:この時点で
class Course < ActiveRecord::Base
# attribute subject
has_many :course_localizations, inverse_of: :course
has_many :course_locations, through: :course_localizations
accepts_nested_attributes_for :course_localizations
end
class CourseLocation < ActiveRecord::Base
# attribute city
has_many :course_localizations
has_many :courses, through: :course_localizations
end
class CourseLocalization < ActiveRecord::Base
belongs_to :course
belongs_to :course_location
accepts_nested_attributes_for :course_locations
end
あなたは
course = Course.new(
subject: "Math",
course_localizations_attributes: [
{ course_location_attributes: { city: "Los Angeles" } },
{ course_location_attributes: { city: "San Francisco" } }]
)
course.save
のおかげでできるはずです!私は 'course' new/editビューでフォームビルダーを使って' accepts_nested_attributes_for'をテストし、コースコントローラの新しいアクション内に '1 times {@ course.courselocations.build}'を追加しました。私がやることは、すでにコースの場所がない場合にフォームをajax経由で読み込むことです。 'courselocalizations'モデルに' accepts_nested_attributes_for:course_locations'を追加する目的は何ですか? –
'course_location'属性を' course_localizations'モデルに渡すことができ、 'course_locations'属性に渡されることを明示しています。属性を2層深く渡す必要があります。すでにajaxを設定している場合は、accepts_nested_attributes_forを使用せず、2つの別々のAPIリクエストを作成することを真剣に検討します。幸運 – Correlator
ありがとう - ajax形式で 'accepts_nested_attributes_for'を使用することの欠点は何ですか?また、2つの別々のAPIリクエストとして言及している場合は、上記の2つのステップのプロセスをどのように使用するのかはわかりません。 –