web-dev-qa-db-ja.com

simple_formとRails 4を使用して複数のネストされたフォームを作成する

次のモデルで簡単なアプリを作成しようとしています:カテゴリ-[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つの質問:

  1. カテゴリ/_form.haml.htmlに複数の質問を作成するにはどうすればよいですか?

  2. カテゴリ+複数の質問+各質問ごとに一度に複数の回答を作成する方法(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:

ここで何が欠けていますか?

13
user2876445

ここで間違っています:= q.simple_fields_for :answers, q.questions.build do |a|モデルオブジェクトの代わりにビルダーオブジェクトquestionsqメソッドを呼び出しています。おそらくあなたはこれが欲しいです:

= q.simple_fields_for :answers, q.object.questions.build
12

最初の2つの質問については、ここで詳しく説明されていると思うので、答えるつもりはありません。 http://railscasts.com/episodes/196-nested-model-form-part-1

エラーについてのヒントをいくつかお伝えしたいと思います。あなたがプロになりたいのなら、あなたは本当にエラーメッセージとスタックトレースを読む方法を学ぶ必要があります。

#のundefined methodquestions 'を示すエラーの詳細な説明は次のとおりです。

まず第一に、完全なスタックトレースを提供することが非常に重要です。これは、行番号が含まれているためです。問題を解決するときは、行番号が重要です。

ここで問題になっている行は= q.simple_fields_for :answers, q.questions.build do |a|だと思います

メッセージを見ると、オブジェクトqのタイプはFormBuilderであることが示されています。これは、form_forまたはfields_forを呼び出すとRailsがインスタンス化されるオブジェクトです。SimpleFormを使用すると、simple_form_forsimple_fields_forにもあります。 、ただし拡張バージョン(ほとんどの場合、装飾バージョンと呼ばれます)。

このオブジェクトqにはメソッドquestionがなく、決してありません! fields_forメソッドがラップする基になるオブジェクトにアクセスしたいとします。 q.objectを介してこれにアクセスできます(詳細については、この投稿を参照してください Rails-form_forおよびfields_forを使用して、fields_forブロック内でサブオブジェクトにアクセスするにはどうすればよいですか? )。

あなたの場合、私はanswersquestionsの組み合わせも想定しています。これはq.simple_fields_for :answers, q.object.answers.buildではなくq.simple_fields_for :answers, q.questions.buildにすべきだと思います。

3
phoet