Ruby on rails 如何使用ActiveJob作业中的url\u/polymorphic\u url?
我有一个从ActiveJob作业内部调用的通知服务(使用延迟的\u作业后端)。每个通知的主题都是一个模型实例,可以是几个不同类中的任意一个。为了方便收件人,我需要包含指向该对象视图的链接 这不起作用,因为url_for在作业上下文中不是可用的方法: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
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' }