【问题标题】:How can I use url_for / polymorphic_url from an ActiveJob job?如何在 ActiveJob 作业中使用 url_for / polymorphic_url?
【发布时间】:2015-09-08 01:13:24
【问题描述】:

我有一个从 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 助手呢?

【问题讨论】:

    标签: ruby-on-rails rails-activejob


    【解决方案1】:

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

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

    在初始化第一个 ActiveJob 时导致“NoMethodError: undefined method `default_url_options=' for ActiveJob::Base:Class”。

    Rails 4 configuration guide 描述了将 config.x… 用于自定义属性。我需要进行以下调整:

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

    config.x.application_job.default_url_options = { host: 'example.com' }
    

    【讨论】:

    【解决方案2】:

    经过更多思考(并阅读 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 的行为作为包含的实例方法而不是作为单例的行为如此不同,但检查源代码证实了这一点。

    有没有更好的解决方案?

    【讨论】:

    • 查看@lucas-nelson 对 rails 4.2+ 的回答
    猜你喜欢
    • 2016-03-25
    • 2023-04-03
    • 2015-03-07
    • 1970-01-01
    • 2015-04-21
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    相关资源
    最近更新 更多