Отправка электронной почты как работа на ruby ​​on rails - PullRequest
0 голосов
/ 07 июня 2019

Добрый день всем,

Я создал почтовую программу для отправки электронного письма моему клиенту. На данный момент я все еще тестирую его, но я не смог заставить его работать. Я прочитал redis, sidekiq, rails_mailer и все еще ничего. Я вижу, что почта находится в очереди интерфейса пользователя sidekiq, но я не могу получить письмо.

Вот поток моего кода.

  1. Пользователь будет проверять текстовое поле в представлении, если он хочет отправить электронное письмо клиенту.

  2. I метод будет запущен на контроллере. Вот мой код.

      def send_workorder_message
        if params.has_key?(:to_send_email)
          WorkorderMessage::WorkorderMessageJob.perform_in(10.seconds, @curr_user, params[:message])
        end
      endv
  1. затем создается задание на работу. вот код.

class WorkorderMessage::WorkorderMessageJob
  # include SuckerPunch::Job
  include Sidekiq::Worker
  sidekiq_options queue: 'mailers'

  def perform(user, message)
    Spree::WorkorderMailer.workorder_send_to_email(user, message).deliver_now


    # ActiveRecord::Base.connection_pool.with_connection do

    # end

  end
end
  1. после этого он запустит WorkorderMailer, здесь код.
    class WorkorderMailer < BaseMailer
    def workorder_send_to_email(to_user, message)
      ActiveRecord::Base.connection_pool.with_connection do

        subject = "sample message mailer"

        @message = message
        @user = to_user

        mail(
          to: @user.email,
          # 'reply-to': Spree::Store.current.support_address,
          from: Spree::Store.current.support_address,
          subject: subject
        )
      end
    end
  end

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

Также я заметил, что на виде sidekiq я вижу это User Obj. Я что нормальный?

enter image description here

1 Ответ

1 голос
/ 07 июня 2019

Согласно документации Sidekiq , передаваемые аргументы должны быть примитивами, которые чисто сериализуются в JSON, а не полными объектами Ruby, такими как user, который вы передаете здесь:

Сложные объекты Ruby не преобразуются в JSON, по умолчанию это будет конвертировать с to_s и выглядеть как #<Quote:0x0000000006e57288>. Даже если они правильно сериализовались, что произойдет, если ваша очередь будет создана и что объект цитаты меняется в то же время? Не сохранять состояние в Sidekiq, сохрани простые идентификаторы. Посмотрите на объекты, как только вы на самом деле нужны они в вашем методе выполнения. Аргументы, которые вы передаете execute_async, должны состоять из простых Типы данных JSON: строка, целое число, число с плавающей запятой, логическое значение, ноль (ноль), массив и Хэш . Это означает, что вы не должны использовать символы ruby ​​в качестве аргументов. Клиентский API Sidekiq использует JSON.dump для отправки данных в Redis. Сервер Sidekiq извлекает эти данные JSON из Redis и использует JSON.load для преобразовать данные обратно в типы Ruby для передачи в ваш метод execute. Не передавайте символы, именованные параметры или сложные объекты Ruby (например, Дата или Время!) Так как те не выживут при выгрузке туда и обратно правильно.

Я бы предложил вам изменить его для поиска пользователя по идентификатору в задании и передавать только идентификатор вместо всего объекта пользователя.

# pass @curr_user.id instead of @curr_user
WorkorderMessage::WorkorderMessageJob.perform_in(10.seconds, @curr_user.id, params[:message])

# accept the ID instead of user here
def perform(user_id, message)

  # get the user object here
  user = User.find(user_id)

  # send the mail
  mail(
    to: user.email,
    #...
end
...