Получение неопределенного метода «Ошибка» в Rails - PullRequest
0 голосов
/ 18 февраля 2020

Я создаю инструмент опроса с помощью Rails. Я пытаюсь настроить проверку ответа, когда участник должен отправить ответ длиной более 5 символов. Я получаю следующую ошибку при попытке добавить новый ответ.

неопределенный метод `errors '

Я читал в других сообщениях, что это, вероятно, будет вызвано тем, что вы не инициализировали объект ответа в контроллере ответов. Моя проблема с этим в том, что у меня есть - это просто не выглядит так:

def new
  @answer = Answer.new
end 

Это выглядит так в моем коде:

  def new
    @study = Study.find(params[:study_id])
    @question = @study.questions.find(params[:question_id])
    @participant = find_participant
    @answer = @question.answers.build(participant: @participant)
  end

Это код для моего Модель ответа:

class Answer < ApplicationRecord
  belongs_to :question
  belongs_to :participant
  validates :answer, presence: true,
            length: { minimum: 5 }
end

И это полная ошибка, которую я получаю на своем сервере:

Started GET "/studies/32/questions/63/answers/new" for ::1 at 2020-02-18 10:14:41 +1300
   (2.1ms)  SELECT sqlite_version(*)
Processing by AnswersController#new as HTML
  Parameters: {"study_id"=>"32", "question_id"=>"63"}
  Study Load (1.1ms)  SELECT "studies".* FROM "studies" WHERE "studies"."id" = ? LIMIT ?  [["id", 32], ["LIMIT", 1]]
  ↳ app/controllers/answers_controller.rb:3:in `new'
  Question Load (1.5ms)  SELECT "questions".* FROM "questions" WHERE "questions"."study_id" = ? AND "questions"."id" = ? LIMIT ?  [["study_id", 32], ["id", 63], ["LIMIT", 1]]
  ↳ app/controllers/answers_controller.rb:4:in `new'
   (0.5ms)  begin transaction
  ↳ app/controllers/answers_controller.rb:33:in `find_participant'
  Participant Create (4.5ms)  INSERT INTO "participants" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2020-02-17 21:14:45.571329"], ["updated_at", "2020-02-17 21:14:45.571329"]]
  ↳ app/controllers/answers_controller.rb:33:in `find_participant'
   (3.0ms)  commit transaction
  ↳ app/controllers/answers_controller.rb:33:in `find_participant'
  Rendering answers/new.html.erb within layouts/application
  Answer Load (1.5ms)  SELECT "answers".* FROM "answers" WHERE "answers"."question_id" = ?  [["question_id", 63]]
  Rendered answers/new.html.erb within layouts/application (Duration: 1228.1ms | Allocations: 13885323)
Completed 500 Internal Server Error in 4106ms (ActiveRecord: 12.0ms | Allocations: 37401284)



ActionView::Template::Error (undefined method `errors' for #<Answer::ActiveRecord_Associations_CollectionProxy:0x00007fae2e5792f0>):
    4:   <%= form_with model: @answer, url: study_question_answers_path(@study, @question), local: true do |form| %>
    5:     <%= form.hidden_field :participant_id %>
    6:    
    7:     <% if @question.answers.errors.any? %>
    8:      
    9:       
   10:     <% end %>

Это мой первый проект rails, и я не уверен, что я ' Я пропал - кто-нибудь может мне помочь?

Спасибо

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

Проблема в том, что @question.answers - это набор из нескольких объектов. Вы не можете просто позвонить .errors по этому вопросу. Вам нужно будет либо l oop просмотреть объекты и вызвать ошибки для каждого из них,

<% @question.answers.each do |answer| %>
  <% if answer.errors.any? %>

  <% end %>
<% end %>

, либо, что, я думаю, вы хотите сделать, просматривая файл представления, - это вызвать это по конкретному c @answer переменная для формы.

<% if @answer.errors.any? %>
0 голосов
/ 18 февраля 2020

Решение, предоставленное @RockwellRice, является правильным, и я проинформировал его для лучшего понимания ниже

answers - это коллекция, а не один объект. Выполните итерацию по ним, а затем вызовите ошибки в одном экземпляре ответа

<% @question.answers.each do |ans| %>
    <% if ans.errors.any? %>

    <% end %>
<% end %>

или, если вы хотите обработать ошибку в указанной записи ответа c, вы можете изменить эту строку

from 
<% @question.answers.errors.any? %>
to 
<% @question.answers[0].errors.any? %>

здесь вы можете обратиться к указанному c ответу через индекс массива, а затем получить доступ к информации об его ошибках

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...