2016-08-02 16 views
0

この質問はRails 4/postgresqlに関するもので、アプリケーションはHerokuでホストされています。Formtastic(Rails)でネストされたリソースを編集/作成する

私はウェブサイト上でクイズ機能を作成していますが、これをできるだけ簡単にするために(Formtasticを使用して)フォームを実装する方法が不思議です。私には3つのモデルがあります:

  • クイズ(has_many:quiz_questions) "あなたがどれくらい素晴らしいかを確認するテスト"
  • QuizQuestion(belongs_to:quiz、has_many:quiz_options)。例えば"1.あなたの好きな色は何ですか")
  • QuizOption(belongs_to:quiz_question)。例えば私はこのようなフォームを設定している

「ブルー」:

フォームはこのようになります
<%= semantic_form_for([:admin, @quiz], :url => admin_quiz_path(@quiz.id)) do |f| %> 
    <%= render 'form' , :f => f %> 
<% end %> 

<%= f.inputs %> 

<h3>Quiz questions</h3> 
<%= f.semantic_fields_for :quiz_questions do |qq_f| %> 
    <%= qq_f.inputs %> 

    <h4>Quiz options</h4> 
    <%= qq_f.semantic_fields_for :quiz_options do |qqo_f| %> 
     <%= qqo_f.inputs %> 
    <% end %> 

<% end %> 

<%= f.actions do %> 
    <%= f.action :submit %> 
    or go <%= link_to 'back', admin_quizzes_path %> 
<% end %> 

それが道を動作していない、しかし、そうですが欲しいです。私はこのフォームでQuizQuestionとQuizOptionsのフィールドを見ることができることを期待しています(それらのオブジェクトがあります)が、私はそうではありません。

さらに重要なのは、このフォームで新しいQuizQuestionを作成し、その後QuizOptionを作成できることです。必ずしもjQuery/Ajaxなどである必要はありませんが、このフォームからすべてを実行したいと思います。

基本的に、私は私のワークフローは次のようになりたい:クイズを作成し、それに値を追加

  1. 。 「作成」をクリックします。
  2. QuizQuestion番号1を追加し、その値に「名前ラベル」などの値を追加します。 「作成」をクリックします。
  3. QuizQuestion番号1とその「名前ラベル」に関連するQuizOptionを追加します。 「作成」をクリックします。
  4. QuizQuestion/QuizOptionを繰り返しクイズが完了するまで。

どうすればいいですか?

答えて

1

ネストされたリソースにはaccept_nested_attributes_forを追加する必要があります。オブジェクトオブジェクトを作成するときには、実際にネストされた子を作成できます(すべての検証を満たしている限り)。この方法:こう

# using the previously quiz model 
quiz.quiz_questions.create(...) 

:ようにあなたが実際にクイズのモデルからQuizQuestionを作成することができますあなたのQuizモデルで

has_many :quiz_questions 
accepts_nested_attributes_for :quiz_questions 

:のような宣言と

# A quiz :has_many :quiz_questions 
@quiz = Quiz.create(...) 

深くネストされたアソシエーションにも同じ効果があります。


おそらく、フォームにフィールドが表示されない理由は、ネストされたオブジェクトが作成されていないためです。私に説明させてください。あなたのquizs_controllerで、新しいクイズオブジェクトを作成する場合(またはものは何でもクイズのための変曲です...)以下のものが必要です。

def new 
    quiz = Quiz.new() 
end 

def create 
    Quiz.new(quiz_params) 
end 

private 

def quiz_params 
    # whitelisted parameters sent along with the form 
    params.require(:quiz).permit(...) 
end 

あなたが実際にできるようにしたい場合フォームにあるbuildメソッドを使用する必要があるフィールドを参照して、実際にそのネストされたリソースごとにその新しいオブジェクトを設定します。

このフォームを使用するには、quizzes_controllerの適切な属性をホワイトリストに追加する必要があります。新しいクイズ処方を送ってすべてが正しいことを確認したら、受信したパラメータをデバッグすることができます。

TIP!ネストされたリソースを動的に追加するときにJSについて心配したくない場合は、cocoon gem

+1

特に「コクーン」を使用して、魅力的なように働きました。ありがとう! – Christoffer

関連する問題