Ruby on rails 如何使用ActiveJob作业中的url\u/polymorphic\u url?

Ruby on rails 如何使用ActiveJob作业中的url\u/polymorphic\u url?,ruby-on-rails,rails-activejob,Ruby On Rails,Rails Activejob,我有一个从ActiveJob作业内部调用的通知服务(使用延迟的\u作业后端)。每个通知的主题都是一个模型实例,可以是几个不同类中的任意一个。为了方便收件人,我需要包含指向该对象视图的链接 这不起作用,因为url_for在作业上下文中不是可用的方法: class NotificationJob < ActiveJob::Base def perform(object, message) NotificationService.send(url_for(object), messa

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

这不起作用,因为url_for在作业上下文中不是可用的方法:

class NotificationJob < ActiveJob::Base
  def perform(object, message)
    NotificationService.send(url_for(object), message)
  end
end
class NotificationJob
在这段代码的早期版本中,我使用了
Rails.application.routes.url\u helpers.model\u name\u url(object)
,但这是特定于模型的。而且,
Rails.application.routes.url\u似乎想要一个控制器/动作规范,而不是一个模型

在mailers中,我可以为(object)
使用
url\u,无论模型类是什么,它都能做正确的事情。那么,我如何访问作业中的多态url帮助程序呢?

经过一番思考(并阅读Rails源代码),我想出了一个解决方案。我在
app/jobs/application\u 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
改变了我原来的课程:

class NotificationJob < ApplicationJob
  def perform(object, message)
    NotificationService.send(url_for(object), message)
  end
end
class NotificationJob
我惊讶地发现,
Rails.application.routes.url\u helpers.url\u作为一个包含的实例方法而不是单例方法的行为是如此不同,但对源代码的检查证实了这一点


有更好的解决方案吗?

@inopinatus的答案很好,但我在Rails 4中被配置绊倒了

config.active_job.default_url_options = { host: "example.com" }
在初始化第一个ActiveJob::Base:Class时导致“NoMethodError:undefined method`default\u url\u options=”为ActiveJob::Base:Class

描述如何使用
config.x..
自定义属性。我需要做以下调整:

def default_url_options
  Rails.configuration.x.application_job.default_url_options
end


请参阅@lucas nelson对rails 4.2+的回答是的,对不起,我应该说我使用的是rails 5。注意:rails 4的文档URL已更改,您现在需要。
def default_url_options
  Rails.configuration.x.application_job.default_url_options
end
config.x.application_job.default_url_options = { host: 'example.com' }