0

現在、delayed_job(gem delayd_job_mongoid)を呼び出して、確認メールを送信しています。ただし、渡した最新のデータを使用していないようで、代わりにキャッシュされたバージョンを使用しています。下記参照:

私のコントローラー:

...
_user.calculate_orders
_user.save
_user.reload
Mailer.delay.order_reported(_user)
...

メーラー

class Mailer < Devise::Mailer
  def order_reported(to_user)
    @to_user = to_user
    email_with_name = "#{@to_user.name} <#{@to_user.email}>"
    mail(:to => email_with_name, :subject => "Test email")
  end
end

たとえば、属性_user.total_orders= 3が5に更新され、保存された場合。これはデータベースに正しく反映され、遅延ジョブDBレコードには更新された情報5が含まれますが、電子メールが送信されると、キャッシュされた情報3が使用されます。

Railsコンソールからメソッドを呼び出してみました。

これは機能し、渡されて更新された情報のパラメーターを使用します

Mailer.order_reported(u).deliver

これは機能せず、キャッシュされたデータを使用します

Mailer.delay.order_reported(u)
4

1 に答える 1

0

最近、 Sidekiqで非常によく似た問題が発生しました。これは、IDだけでなく、シリアル化されたバージョンのUserオブジェクトを渡すことに関連しています。

少しリファクタリングして、delayedメソッドのパラメーターとして単純なオブジェクトのみを渡すようにします。したがって、代わりにこれを行うことができます:

Mailer.delay.order_reported(_user.id)

次に、メソッドを更新して次のように読み取ります。

class Mailer < Devise::Mailer
  def order_reported(to_user_id)
    @to_user = User.find(to_user_id)
    email_with_name = "#{@to_user.name} <#{@to_user.email}>"
    mail(:to => email_with_name, :subject => "Test email")
  end
end

これにより、メーラーが実際に配信されたときに常に新しいユーザーオブジェクトを取得できます。

于 2013-03-19T17:52:13.750 に答える