2

これを行う方法を理解するのに苦労しています。プロジェクトとコースの 2 つのモデルがあります。

#project.rb
belongs_to :course
attr_accessible :course_id, :course
accepts_nested_attributes_for :course, reject_if: lambda { |a| a[:course_id] == 0 }

#course.rb
has_many :projects

Projects#newページ (子オブジェクト) で、新しいオブジェクトの名前を入力して、親オブジェクトを作成したいとcourse考えています。

ビューでの私の試みは次のとおりですが、正しく機能していないようです。

= form_for [@user, @project] do |f|

  # Other fields

  = fields_for :course do |builder|
    = builder.label :name, 'Course Name'
    = builder.text_field :name

  = f.submit

後でこの親オブジェクトを使用してさらに多くのプロジェクトを作成しますが、ここでは存在しないと仮定しましょう。

更新 1 fields_for を次のように変更しました (Ryan の要求に従って):

= form_for [@user, @project] do |f|

  # Other fields

  = f.fields_for :course do |builder|
    = builder.label :name, 'Course Name'
    = builder.text_field :name

  = f.submit

私はhamlを使用しているので、=表示されるはずですが、ページや生成されたhtmlにフィールドが表示されません。その理由についての手がかりはありますか?(送信ボタンは表示されます)

更新 2 潜在的な解決策を見つけましたが、これが正しいアプローチ方法であるかどうかはわかりません。コントローラーで、fields_for が表示されるようにコースを構築する必要があります。

# ProjectsController
def new
  @project  = @user.projects.new
  @project.build_course
end

# project.rb
attr_accessible :course_attributes
# So yes, I now see what you were talking about, regarding the course_attributes
4

2 に答える 2

3

フォームビルダーを使用して、オブジェクトを構築するだけでなく、オブジェクトを構築する必要がありますfields_for

あなたはこれを持っています:

= fields_for :course do |builder|

これが必要な場所:

= f.fields_for :course do |builder|

違いは、最初のフォームビルダーで呼び出すことにより、Rails は最初の呼び出し (この場合は)course_attributes=からオブジェクトにメソッドがあるかどうかを確認し、存在する場合はそれを定義することです。このフォーム内のフィールドは.form_for@projectcourse_attributes

この変更の前後のフォームを調べてください。待ちます。

accepts_nested_attributes_forこれは、モデル内の呼び出しによって可能になります。course_attributes=ネストされた属性を機能させるメソッドを定義するのは、このメソッドです。プロジェクトを作成したら、コースも作成する必要があります。

また、course_idフォームがそれを設定しないため、アクセス可能な属性を作成する必要はありません。

于 2012-01-23T03:36:55.957 に答える
0

gem 'dynamic_form' を使用しました。教員リスト(id、教員名)テーブルには、学部の名前が含まれています。

<%= f.select :faculty, options_from_collection_for_select(@faculty_list, 'id', 'faculty_name', @faculty.faculty.to_i) %>
于 2012-01-20T00:12:51.570 に答える