2

我有一个从 ActiveJob 作业内部调用的通知服务(使用延迟作业后端)。每个通知的主题是一个模型实例,可以是几个不同类中的任何一个。为了方便收件人,我需要包含指向该对象视图的链接。

这不起作用,因为 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 回答