0

私は古いと改訂の両方を以下だった私は、同じラインに沿って行う必要があり建物調査は5

私はいくつかの時点件までそれに続くが、どちらも表示されている質問です何かのためrailscasts & thisフォーム上にも答えが追加されることはありません。以下の私のモデルコードである

answers.rb

class Answer < ActiveRecord::Base 
    attr_accessor :content, :question_id 
    belongs_to :question 
end 

surveys.rb

class Survey < ApplicationRecord 
    attr_accessor :name, :questions_attributes 
    has_many :questions 
    accepts_nested_attributes_for :questions, allow_destroy: true 
end 

questions.rb

class Question < ApplicationRecord 
    attr_accessor :content, :survey_id, :answers_attributes 
    belongs_to :survey 
    has_many :answers 
    accepts_nested_attributes_for :answers, allow_destroy: true 
end 

調査コントローラー

class SurveysController < ApplicationController 
    before_action :set_survey, only: [:show, :edit, :update, :destroy] 

    # GET /surveys 
    # GET /surveys.json 
    def index 
    @surveys = Survey.all 
    end 

    # GET /surveys/1 
    # GET /surveys/1.json 
    def show 
    end 

    # GET /surveys/new 
    def new 
    @survey = Survey.new 
    3.times do 
     question = @survey.questions.build 
     4.times { question.answers.build } 
    end 
    end 

private 
    # Use callbacks to share common setup or constraints between actions. 
    def set_survey 
     @survey = Survey.find(params[:id]) 
    end 

    # Never trust parameters from the scary internet, only allow the white list through. 
    def survey_params 
     params.require(:survey).permit(:name, :question_id) 
    end 
end 

ビュー

_form.html.erb

<%= f.fields_for :questions do |builder| %> 
    <%= render 'question_fields', f: builder %> 
<% end %> 
<%= link_to_add_fields "Add Question", f, :questions %> 

_question_fields.html.erb

<fieldset> 
    <%= f.label :content, "Question" %><br /> 
    <%= f.text_area :content %><br /> 
    <%= f.check_box :_destroy %> 
    <%= f.label :_destroy, "Remove Question" %> 
    <%= f.fields_for :answers do |builder| %> 
    <%= render 'answer_fields', f: builder %> 
    <% end %> 
    <%= link_to_add_fields "Add Answer", f, :answers %> 
</fieldset> 

_answers_fields.html.erb

<p> 
    <%= f.label :content, "Answer" %> 
    <%= f.text_field :content %> 
    <%= f.check_box :_destroy %> 
    <%= f.label :_destroy, "Remove" %> 
</p> 

show.html.erb

<p id="notice"><%= notice %></p> 

<p> 
    <strong>Name:</strong> 
    <%= @survey.name %> 
</p> 

<ol> 
    <% for question in @survey.questions %> 
    <li><%= h question.content %></li> 
    <% end %> 
</ol> 

<p> 
    <%= link_to "Edit", edit_survey_path(@survey) %> | 
    <%= link_to "Destroy", @survey, :confirm => 'Are you sure?', :method => :delete %> | 
    <%= link_to "View All", surveys_path %> 
</p> 

移行

class CreateSurveys < ActiveRecord::Migration[5.0] 
    def change 
    create_table :surveys do |t| 
     t.string :name 

     t.timestamps 
    end 
    end 
end 

class CreateQuestions < ActiveRecord::Migration[5.0] 
    def change 
    create_table :questions do |t| 
     t.string :survey_id 
     t.string :integer 
     t.text :content 

     t.timestamps 
    end 
    end 
end 

は何か他のものは私がいることを逃していますありますドンにする必要がある私はこれで数時間を過ごしましたが、それはまだ私に混乱していますなぜそれは私にこれを示すのですかエラー - テーブル 'app.answers'は存在しません私はネストされたフォームから回答を呼んでいます。この点に関する助けは非常に高く評価されるでしょう。

+0

サーベイビューフォームを投稿できますか?あなたがnested_attributesを期待しているように見えますが、 'permit'呼び出しでホワイトリストに載っていないので、フォームが正しく設定されているかを確認してください。 –

+0

主な問題は、サーベイコントローラのこの新しい方法 - 4倍{question.answers.build} –

+0

ああ、あなたも視野に入っていない、大丈夫...あなたはマイグレーションとすべてを実行した、正しい? –

答えて

1

ここでの主な問題は、テーブルを作成して作成して実行し、問題を修正する必要がある「回答」の移行を忘れたようです。

さらに、それらのattr_accessorコールは物事を混乱させるでしょう。以前のバージョンのRailsでは必要でしたが、もはや今ではなく、ただ物事を捨てるだけです。例

post = Post.new(title: "Something") 
#=> #<Post id: nil, title: "Something", created_at: nil, updated_at: nil> 
post.title = "Something Else" 
#=> "Something Else" 
puts post 
#=> #<Post id: nil, title: "Something Else", created_at: nil, updated_at: nil> 

なしattr_accessorコード

post = Post.new(title: "Something") 
#=> #<Post id: nil, title: nil, created_at: nil, updated_at: nil> 
post.title = "Something" 
#=> "Something" 
puts post 
#=> #<Post id: nil, title: nil, created_at: nil, updated_at: nil> 

あなたが見ることができるように、私のPostモデルがtitle属性のattr_accessorを持っていた最初のブロック、何が期待どおりに動作しませんでした。タイトルを更新できませんでした。私がそれを取り除くと、物事は彼らのように働き始めました。

チャット議論に基づいて、あなたの_form.html.erbform_forタグが欠落している、とあなたは_answers_field.html.erbを持っていると_question_fields.html.erb

<%= render 'answer_fields', f: builder %> 

お知らせを呼び出している

<%= form_for @survey do |f| %> 
    <%= f.label :name %><br /> 
    <%= f.text_field :name %> 
    <!-- your current code here --> 
<% end %> 

のようなもの、複数に見えるはずです/特異なミスマッチ。チャットから

と(私が間違ってる場合を除き)最後に、あなたのコントローラでは、あなたがのように見える終わるべきで、ネストされた属性のparamsを許可されていません

def survey_params 
    params.require(:survey).permit(:name, :question_attributes: [:id, :content, :_destroy, answer_attributes: [:id, :content, :_destroy]) 
end 

問題の最後のカップルは組合ということでした最後に、AnswerがActiveRecord :: Baseと他のモデルを継承しているということです。

+0

私はattr_accessorをコメントアウトしても、同じ問題を示しています。ビューコードを更新しました。 –

+0

また、あなたが私のようなレール5の初心者の場合は、inverse_ofのビットを読み取る必要があります。詳細はこちら - http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html –