Неопределенный метод для '[]' для nil: NilClass в Rails - PullRequest
0 голосов
/ 04 мая 2019

Я пытаюсь подтвердить ответ для question модели с options.У меня есть метод link_to check_answer для каждого вопроса.Проблема в том, что объект вопроса не передается методу.На этой же странице у меня есть метод link_to edit, в котором передается объект вопроса.Даже URL на link_to check_answer показывает правильный URL.Где здесь ошибка?

show.html.erb

<p>
  <strong>Body:</strong>
  <%= @question.body %>
</p>

<p>
  <strong>Option:</strong>
  <% @question.options.each do |p| %>
    <%= radio_button_tag('option',p.id) %>
    <%= p.body %>

  <% end %>
</p>
<p><%= link_to 'Check Answer', check_answer_question_path(@question) %></p>
<p>
  <strong>User:</strong>
  <%= @question.user.email %>
</p>

<%= link_to 'Edit', edit_question_path(@question) %> |
<%= link_to 'Back', questions_path %>

Здесь link_to Edit передает объект @question в controller но не link_to Check Answer.

controller.rb

def check_answer        
    puts(@question.id)        
end

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

rout.rb

Rails.application.routes.draw do
  resources :questions do
    member do
        get 'check_answer'
    end
  end
end

стек ошибок

Started GET "/questions/22/check_answer" for 127.0.0.1 at 2019-05-04 19:51:17 +0530
Processing by QuestionsController#check_answer as HTML
  Parameters: {"id"=>"22"}
  User Load (0.4ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 1], ["LIMIT", 1]]
  ↳ /home/laxmanrm/.rvm/gems/ruby-2.6.0/gems/activerecord-5.2.3/lib/active_record/log_subscriber.rb:98
------------------------------------check_answer------------------------------------------
Completed 500 Internal Server Error in 5ms (ActiveRecord: 0.4ms)



NoMethodError (undefined method `id' for nil:NilClass):

app/controllers/questions_controller.rb:72:in `check_answer'

ошибка

enter image description here

1 Ответ

2 голосов
/ 04 мая 2019

Вам нужно заполнить переменную экземпляра @question перед вызовом действия check_answer, для чего вы можете использовать before_action

before_action :set_question, only: [:show, :edit, :update, :destroy, :check_answer]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...