-1

この例は一種の決まり文句です。二重ネストされたフォームについては、Railscasts エピソード #196 ( http://railscasts.com/episodes/196-nested-model-form-revised?autoplay=true ) に従っています。

私が受け取るエラーは、私のaccept_nested_attributes_forコマンドが強力なパラメーターのanswers_attributesを生成していないということです。

モデル:

class Survey < ActiveRecord::Base
  has_many :questions
  accepts_nested_attributes_for :questions
end

class Question < ActiveRecord::Base
  belongs_to :survey
  has_many :answers
  has_many :users, through: :answers
  accepts_nested_attributes_for :answers
end

class Answer < ActiveRecord::Base
  belongs_to :question
  belongs_to :user
end

次に、私の調査コントローラー:

class SurveysController < ApplicationController

  def index
    @survey = current_user.surveys
  end

 def new
   @survey = Survey.new
   @question = @survey.questions.build   # the nested form won't show up if I don't
   @answer = @question.answers.build     #Not sure if I need this line. doesn't work either way.
 end

 def create
   @survey = Survey.new(survey_params)
   if @survey.save
     redirect_to @survey, notice: "Survey successfully created."
   else
     render 'new'
   end
 end

# rest.. show, edit, update, destroy


private

def survey_params
  params.require(:survey).permit! 
end

#def survey_params
  #params.require(:survey).permit(:user_id, :name, { questions_attributes: [:_destroy, :id, :survey_id, :content, { answers_attributes: [:_destroy, :id, :content, :user_id, :question_id]}]})
 #end 
end

私が抱えている問題はこれです(空のフォーム送信)。実際のコードを実行すると、次のようになります。

{"utf8"=>"✓", "authenticity_token"=>"[token]=", "survey"=>{"user_id"=>"1", "name"=>"test", "questions_attributes"=>{"0"=>{"content"=>"test", "_destroy"=>"0"}}, "answers"=>{"content"=>"test", "_destroy"=>"0"}}, "commit"=>"Create", "action"=>"create", "controller"=>"surveys"}
Unpermitted attributes: answers

それから許可を実行すると!私はこれを取得しますが、力をテストする方法:

unknown attribute: answers

Rails は、回答ではなく、answers_attributes を探す必要があります。それは、モデルを認識していないと思います。したがって、ここにスキーマがあります。

create_table "questions", force: true do |t|
  t.integer  "survey_id"
  t.string   "content"
  t.datetime "created_at"
  t.datetime "updated_at"
end

create_table "answers", force: true do |t|
  t.integer  "question_id"
  t.string   "content"
  t.datetime "created_at"
  t.datetime "updated_at"
  t.integer  "user_id"
end

answer_attributes の代わりに答えを探すようにレールに何らかの方法で指示するという私のエラーを修正する方法についてのアイデアがあれば教えてください。

更新: これが私のフォームです。

<%= form_for @survey do |f| %>
<%= f.label :user_id %>


<%= f.collection_select :user_id, User.all, :id, :email, {}, { :multiple => false } %><br>
<%= f.text_field :name, placeholder: "Survey name"%>


<%= f.fields_for :questions do |builder| %>
  <%= builder.label :content, "Question 1"%>
  <%= builder.text_area :content %>
  <%= builder.check_box :_destroy %>
  <%= builder.label :_destroy, "Remove Question" %>

  <%= f.fields_for :answers do |builder| %>
    <%= builder.text_field :content, placeholder: "Answer 1" %>
    <%= builder.check_box :_destroy %>
  <% end %>
<% end %><br>

<%= f.submit "Create", :class => "btn btn-large btn-warning"  %>
<% end %>
4

1 に答える 1

0

解決策は、フォームの見落としでした。使った...

<%= f.fields_for :questions do |builder| %> 

...調査の下で関連付けを構築し、誤って使用する...

<%= f.fields_for :answers do |builder| %>

...質問の下で答えを構築します。変数を変更する必要があったfため、肩は次のようになりました。

<%= builder.fields_for :answers do |x| %>

そのため、質問ではなくアンケートで回答を探していました。みんなありがとう。

于 2013-09-17T19:11:21.427 に答える