

入門書をやっているのですがアソシエーションのところ？でうまくいかず、undefined method `question_id' for
nil:NilClass が出てきてしまいます。belongs_to, has_manyのところはちゃんとかいてるつもりなのですが。。。  
createのquestion_idのところでエラーがでます。

answers_controller.rb

[code]

      class AnswersController < ApplicationController
        before_action :set_answer, only: [:show, :edit, :update, :destroy]
    
        # GET /answers
        # GET /answers.json
        def index
          redirect_to '/questions'
        end
    
        # GET /answers/1
        # GET /answers/1.json
        def show
          redirect_to '/questions'
        end
    
        # GET /answers/new
        def new
          @answer = Answer.new
        end
    
        # GET /answers/1/edit
        def edit
          redirect_to '/questions'
        end
    
        # POST /answers
        # POST /answers.json
    
        def create
          end_counter = 10 #終了にする回答数
          @answer = Answer.new(answer_params)
          respond_to do |format|
            if @answer.save
            num = Answer.where('question_id = ?',@amswer.question_id).count
            if num >= end_counter then
              q = Quetion.find @answer.question_id
              q.finished = true
              q.save
            end
              format.html { redirect_to '/questions/' + @answer.question_id.to }
              format.json { render :show, status: :created, location: @answer }
            else
              format.html { render :new }
              format.json { render json: @answer.errors, status: :unprocessable_entity }
            end
          end
        end
    
        # PATCH/PUT /answers/1
        # PATCH/PUT /answers/1.json
        def update
          redirect_to '/questions'
        end
    
        # DELETE /answers/1
        # DELETE /answers/1.json
        def destroy
          redirect_to '/questions'
        end
    
        private
          # Use callbacks to share common setup or constraints between actions.
          def set_answer
            @answer = Answer.find(params[:id])
          end
    
          # Never trust parameters from the scary internet, only allow the white list through.
          def answer_params
            params.require(:answer).permit(:question_id, :content, :name)
          end
      end
    
[/code]

answer.rb

[code]

    class Answer < ApplicationRecord
        belongs_to :question
    
        validates :content, :name, presence: {message:'is necessary.'}
      end
    
[/code]

question.rb

[code]

      class Question < ApplicationRecord
        has_many :answer
    
        validates :content, :name, presence: {message:'is necessary.'}
      end
    
[/code]


CC BY-SA 3.0
2017-02-02T15:28:11.150
32342
2017-02-03T08:03:47.087
20496
question
ruby-on-rails ruby
undefined method `question_id' for nil:NilClass　とエラーが出ます


typoです。

amswer → answer


CC BY-SA 3.0
2017-02-02T16:10:53.893
32344
2017-02-02T16:10:53.893
19110
32342
answer


> belongs_to, has_manyのところはちゃんとかいてるつもりなのですが。。。

今回のエラーの場合、そのあたりに問題がある可能性は低いでしょう。それを説明します。

「undefined method 'メソッド名' for
値:クラス名」というエラーは、「[クラス名]型の[値]に[メソッド名]が定義されていない」という意味になります。今回のエラーはどうでしょうか。

> undefined method `question_id' for nil:NilClass  
>  => NilClass 型の値 nil に question_id メソッドは定義されていない

おかしいですね、Answerクラスのオブジェクトに対してquestion_idを呼び出したはずなのに、NilClassの値nilだなんて。でも逆に言えば、
**Answerクラスの定義以前の問題** のようです。

[code]

    num = Answer.where('question_id = ?',@amswer.question_id).count
    
[/code]

`@amswer.question_id` としているので、`@amswer` が `nil` になっているようです。

インスタンス変数が意図せず nil になっている原因をざっくりわけると、

  * どこかで nil を代入してしまっている  
(例: 初期化に使ったメソッドが nil を返した)

  * [未初期化・未定義のインスタンス変数を参照している](https://docs.ruby-lang.org/ja/latest/doc/spec=2fvariables.html)  
(例: 変数名を間違えている)

のどちらかです。今回は後者だったわけですね。

`undefined ... for nil:NilClass` というエラーを見かけたら、まずは対象が nil になっていることに注目しましょう。大抵は
**nil になっていることがおかしい** はずです。


CC BY-SA 3.0
2017-02-03T08:03:47.087
32362
2017-02-03T08:03:47.087
8000
32342
answer