Неопределенный метод при настройке почтовых программ

#ruby-on-rails #ruby-on-rails-4

#ruby-on-rails #ruby-on-rails-4

Вопрос:

Я пытаюсь настроить почтовые программы в своем приложении (в первый раз), чтобы при ответе на вопрос пользователя они получали уведомление по электронной почте.

Моя проблема в том, что я не могу заставить контроллер работать без ошибок.

Мои маршруты выглядят так:

  resources :questions do
   resources :answers
 end
  

В моем answers_controller у меня есть это:

 def create
  @answer = Answer.new(answer_params)
  @question = Question.find(params[:question_id])

if @answer.save
  UserMailer.question_answer(@user).deliver
 end 
end
  

В файле user_mailer.rb у меня есть это:

  def question_answer(user) 
   @answer = Answer.new
   @question = @answer.question
   mail(:to => @question.user.email, :subject => "Your question was answered!")  
 end 
  

Однако при отправке ответа я получаю эту ошибку:

 undefined method `user' for nil:NilClass
  

Комментарии:

1. @user должно быть равно нулю, когда оно передается из действия create . Убедитесь @user , что он находится в области видимости.

2. Хм, я немного запутался. Ошибка подчеркивает третью строку в user_mailer.rb, но должен ли я все же добавить что-то вроде «@user = @question.user» в действие создания?

3. да, он не выдаст ошибку, пока не попытается использовать nil. У него не будет никаких проблем с передачей nil. Итак, это означает, что вам нужно вернуться назад и выяснить, почему это nil. Попробуйте эту точную строку сразу после if @answer.save

4. Нет, не повезло с добавлением этой строки.

5. Похоже, проблема в mail(:to => @question.user.email). @вопрос может быть нулевым.

Ответ №1:

Вам нужно передать @answer в параметре, например,

 UserMailer.question_answer(@answer, @user).deliver
  

и вы получите вопрос от @answer. в mailer.rb

 def question_answer(answer, user) 
  @answer = answer
  @question = @answer.question
  @user = user
  mail(:to => @question.user.email, :subject => "Your question was answered!")  
end
  

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

Надеюсь, это поможет.

Комментарии:

1. @user2759575: Отлично, с удовольствием 🙂