2

ActiveJob ジョブ内から呼び出している通知サービスがあります (delayed_job バックエンドを使用)。各通知の対象はモデル インスタンスであり、いくつかの異なるクラスのいずれかになります。受信者の便宜のために、そのオブジェクトのビューへのリンクを含める必要があります。

url_for はジョブ コンテキストで使用できるメソッドではないため、これは機能しません。

class NotificationJob < ActiveJob::Base
  def perform(object, message)
    NotificationService.send(url_for(object), message)
  end
end

このコードの以前のより限定的なバージョンでは、 を使用Rails.application.routes.url_helpers.model_name_url(object)しましたが、これはモデル固有です。Rails.application.routes.url_forモデルではなく、コントローラー/アクションの仕様が必要なようです。

メーラーでは使用できurl_for(object)、モデル クラスに関係なく、正しいことを行います。では、ジョブ内のポリモーフィック URL ヘルパーにアクセスするにはどうすればよいでしょうか?

4

2 に答える 2

8
于 2016-05-26T00:41:09.437 に答える
5

もう少し考えて (そして Rails のソースを読んで)、解決策を思いつきました。app/jobs/application_job.rbジョブを継承するアプリ固有の基本クラスを作成しました。

class ApplicationJob < ActiveJob::Base
  include Rails.application.routes.url_helpers

  protected
  def default_url_options
    Rails.application.config.active_job.default_url_options
  end
end

に必要なものを追加しましたconfig/application.rb:

config.active_job.default_url_options = { host: "example.com" }

そして私の元のクラスを次のように変更しました:

class NotificationJob < ApplicationJob
  def perform(object, message)
    NotificationService.send(url_for(object), message)
  end
end

Rails.application.routes.url_helpers.url_forシングルトンとしてではなく、インクルードされたインスタンス メソッドとしての動作が大きく異なることに驚きましたが、ソースを調べてみるとそれが確認されました。

より良い解決策はありますか?

于 2015-09-08T02:59:02.103 に答える