次のモデルで簡単なアプリを作成しようとしています:カテゴリ-[has_many]->質問-[has_many]->回答
カテゴリと質問(categories/_form.haml.html)を作成するための次のコードがあります。
= simple_form_for(@category) do |f|
= f.error_notification
= f.input :title, label: "Category title: "
= f.simple_fields_for :questions, @category.questions.build do |q|
= q.input :content, label: "Question content: "
= f.button :submit
そして、私は質問と回答を作成するためにすべて同じコードを使用しています(questions/_form.haml.html)。私はすべての関係、強力なパラメーター、ネストされた属性、およびコントローラーを構成しました。それは私にとっては問題なく機能します。
2つの質問:
カテゴリ/_form.haml.htmlに複数の質問を作成するにはどうすればよいですか?
カテゴリ+複数の質問+各質問ごとに一度に複数の回答を作成する方法(categories/_form.haml.html内)?
私は2番目のものを達成する方法を理解しようと数時間を費やしました、そして私が見つけることができたすべての情報はRails 3.0とform_forに関連しています。それらのどれも私のために働きませんでした。
ここで最も簡単な解決策は次のようになります。
= simple_form_for(@category) do |f|
= f.error_notification
= f.input :title, label: "Category title: "
= f.simple_fields_for :questions, @category.questions.build do |q|
= q.input :content, label: "Question content: "
= q.simple_fields_for :answers, q.questions.build do |a|
= a.input :content, label: "Answer content"
= f.button :submit
しかし、それは私に与えます
undefined method `questions' for #<SimpleForm::FormBuilder:
ここで何が欠けていますか?
ここで間違っています:= q.simple_fields_for :answers, q.questions.build do |a|
モデルオブジェクトの代わりにビルダーオブジェクトquestions
でq
メソッドを呼び出しています。おそらくあなたはこれが欲しいです:
= q.simple_fields_for :answers, q.object.questions.build
最初の2つの質問については、ここで詳しく説明されていると思うので、答えるつもりはありません。 http://railscasts.com/episodes/196-nested-model-form-part-1
エラーについてのヒントをいくつかお伝えしたいと思います。あなたがプロになりたいのなら、あなたは本当にエラーメッセージとスタックトレースを読む方法を学ぶ必要があります。
#のundefined method
questions 'を示すエラーの詳細な説明は次のとおりです。
まず第一に、完全なスタックトレースを提供することが非常に重要です。これは、行番号が含まれているためです。問題を解決するときは、行番号が重要です。
ここで問題になっている行は= q.simple_fields_for :answers, q.questions.build do |a|
だと思います
メッセージを見ると、オブジェクトq
のタイプはFormBuilder
であることが示されています。これは、form_for
またはfields_for
を呼び出すとRailsがインスタンス化されるオブジェクトです。SimpleFormを使用すると、simple_form_for
とsimple_fields_for
にもあります。 、ただし拡張バージョン(ほとんどの場合、装飾バージョンと呼ばれます)。
このオブジェクトq
にはメソッドquestion
がなく、決してありません! fields_for
メソッドがラップする基になるオブジェクトにアクセスしたいとします。 q.object
を介してこれにアクセスできます(詳細については、この投稿を参照してください Rails-form_forおよびfields_forを使用して、fields_forブロック内でサブオブジェクトにアクセスするにはどうすればよいですか? )。
あなたの場合、私はanswers
とquestions
の組み合わせも想定しています。これはq.simple_fields_for :answers, q.object.answers.build
ではなくq.simple_fields_for :answers, q.questions.build
にすべきだと思います。