문제

백그라운드에서 전자 메일을 보내려고 할 때 응용 프로그램에 문제가 발생합니다. Error AcceroDiceTagcode가 발생하지 않으며, 어떤 제안이 없습니까?

내 작업자는 uninitialized constant AnswersController::LazyDoer

에 있습니다.

여기 내 컨트롤러가 있습니다 :

class AnswersController < ApplicationController
  before_action :authenticate_user!
  before_action :set_question, except: [:adding_likes,:accept]

  def create
    @answer = Answer.new(answer_params)
    @answer.user_id = current_user.id
    @answer.question_id = @question.id
    @question_owner = User.find(@question.user_id)

    if @answer.save
      LazyDoer.perform_async(@question_owner,current_user,@answer,@question)
      redirect_to question_path(@question), notice: "Answer was successfully created."
    else    
      render(:template => "questions/show", alert: "There was an error when adding answer.")

    end
  end
.

여기에서는 작업자가 있습니다 :

class LazyDoer
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform(question_owner,current_user,answer,question)
    @question_owner = question_owner
    @current_user = current_user
    @answer = answer
    @question = question
    UserMailer.send_email(@question_owner,@current_user,@answer,@question).deliver
  end
end
.

편집 :

LazyDoer Worker를 완전히 작동 시켰지만 이제는 이제 이메일을 보내는 데 문제가 있습니다.가장 중요한 것은 메일러가 sidekiq 없이 완벽하게 작동합니다.사이드 키크 내의 오류가 있습니다 :

2014-07-30T19:28:38.479Z 4317 TID-amn3w LazyDoer JID-3e465606b1d5728181002af0 INFO: start
2014-07-30T19:28:38.480Z 4317 TID-amn3w LazyDoer JID-3e465606b1d5728181002af0 INFO: fail: 0.001 sec
2014-07-30T19:28:38.481Z 4317 TID-amn3w WARN: {"retry"=>false, "queue"=>"default", "class"=>"LazyDoer", "args"=>["matthew.kilan@gmail.com", "matthew.kilan@gmail.com", "#<Answer:0x000000045fd148>", "#<Question:0x000000045fe728>"], "jid"=>"3e465606b1d5728181002af0", "enqueued_at"=>1406748518.4762628}
2014-07-30T19:28:38.481Z 4317 TID-amn3w WARN: undefined method `email' for "matthew.kilan@gmail.com":String
2014-07-30T19:28:38.481Z 4317 TID-amn3w WARN: /home/mateusz/Pulpit/Aptana3_Workspace/challenge_app/app/mailers/user_mailer.rb:9:in `send_email'
.

및 여기에 내 메일러가 있습니다.

class UserMailer < ActionMailer::Base
  default from: "matthew.kilan@gmail.com"

  def send_email(question_owner,cur_user,answer,question)
    @question_owner = question_owner
    @cur_user = cur_user
    @answer = answer
    @question = question
    mail(to: @question_owner.email, subject: "Answer added to your question:")
  end

  def accepted_email(user,answer,question)
    @user = user
    @answer = answer
    @question = question
    mail(to: @user.email, subject: "Your answer has been accepted")
  end
end
.

도움이 되었습니까?

해결책

솔루션이 있으며, SideKiq 오류의 문제는 Redis 인 NoSQL 데이터베이스를 사용하고 있기 때문에 Redis는 작업자에게 보내려는 경우 ActiveRecord 모델과 같은 복잡한 레일 데이터를 제대로 이해할 수 없습니다., 그가 가지고있는 모든 단일 속성을 가진 전체 사용자는 Redis에서는 작동하지 않습니다. 데이터는 너무 복잡합니다.솔루션은 간단하고 생성 된 전자 메일보기 및 mailer.rb에서 정확히 보이고 필요한 속성을 정확히보아야합니다. 작업자에게 해당 속성 만 보내려면 전체 ActiveRecord 모델을 보내지 마십시오.

여기에서는 고정 작업자가 있습니다.

class LazyDoer
  include Sidekiq::Worker
  sidekiq_options retry: false

  def perform(question_owner_email,current_user_name,answer_contents,question_title)
    UserMailer.send_email(question_owner_email,current_user_name,answer_contents,question_title).deliver
  end
end
.

고정 컨트롤러 (가장 중요한) :

class AnswersController < ApplicationController
  before_action :authenticate_user!
  before_action :set_question, except: [:adding_likes,:accept]

  def create
    @answer = Answer.new(answer_params)
    @answer.user_id = current_user.id
    @answer.question_id = @question.id
    @question_owner = User.find(@question.user_id)

    if @answer.save
      LazyDoer.perform_async(@question_owner.email,current_user.name,@answer.contents,@question.title)
      #DLA MAILERA BEZ SIDEKIQ UserMailer.send_email(@question_owner,current_user,@answer,@question).deliver
      redirect_to question_path(@question), notice: "Answer was successfully created."
    else    
      #redirect_to question_path(@question), alert: "There was an error when adding answer."
      render(:template => "questions/show", alert: "There was an error when adding answer.")
    end
  end
end
.

고정 사용자 메일러 :

class UserMailer < ActionMailer::Base
  default from: "matthew.kilan@gmail.com"

  def send_email(question_owner_email,cur_user_name,answer_contents,question_title)
    @question_owner_email = question_owner_email
    @cur_user_name = cur_user_name
    @answer_contents = answer_contents
    @question_title = question_title
    mail(to: @question_owner_email, subject: "Answer added to your question:")
  end
end
.

ERB 대신 슬림 템플릿 언어 사용과 함께 수정 된 전자 메일보기 :

doctype html
html
    head
        meta content="text/html; charset=UTF-8" http-equiv="Content-Type"
    body
        h1 Your question #{@question_title} has been answered
        p   
            |
                Answered by #{@cur_user_name}
                <br />
                The answer content is:
                <br />
                #{@answer_contents}

        p Accept or like the answer if it was useful for you.
.

다른 팁

Instead of sending user object in @question_owner send user id.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top