【问题标题】:How can I set default_url_options for Sidekiq workers?如何为 Sidekiq 工作人员设置 default_url_options?
【发布时间】:2013-02-02 06:26:41
【问题描述】:

我有一个 Sidekiq 工作人员,旨在执行社交活动(例如:喜欢 Facebook 上的页面)。其中一部分需要知道被赞对象的 URL。

幸运的是,Rails 3 通过在需要访问 path/url 辅助方法的任何类或模块中包含 Rails.application.routes.url_helpers 来轻松访问特定于应用程序的路由。

我遇到的问题是,我的默认 url/端口无法从我的 Sidekiq 工作程序中访问,尽管各种尝试在我的 development.rbproduction.rb 中定义它们。

class Facebook::LikeRecipeWorker
  include Sidekiq::Worker
  include Rails.application.routes.url_helpers

  sidekiq_options queue: :facebook

  def perform(recipe_id, user_id)
    recipe = Recipe.find(recipe_id)
    user = User.find(user_id)

    if user.facebook_token
      api = Koala::Facebook::API.new(user.facebook_token)
      api.put_connections 'me', 'my_namespace:like', object: recipe_url(recipe)
    end
  end
end

recipe_url 方法被访问时,ArgumentError 会引发消息:

ArgumentError:缺少要链接的主机!请提供 :host 参数,设置 default_url_options[:host],或设置 :only_path 为 true

我知道我可以在特定环境的配置文件中为ActionControllerActionMailer 指定default_url_options,例如:

config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
config.action_controller.default_url_options = { host: 'localhost', port: 3000 }

但是,这些(理所当然地)似乎对我的 Sidekiq 工人阶级没有影响。我应该如何为这些类定义default_url_options

【问题讨论】:

    标签: ruby-on-rails routing worker sidekiq


    【解决方案1】:

    我们所做的是:

    在您的配置文件(例如 config/application.rb、config/production.db 等)中,有一行设置默认值:

     routes.default_url_options = { host: 'www.example.org' }
    

    【讨论】:

    • 将接受的答案更改为您的答案,因为它显然对人们更有效。谢谢!
    【解决方案2】:

    我找到了一个潜在的解决方案,虽然感觉有点像 hack。我绝对愿意接受更好的答案。

    首先,在我的环境文件(例如:config/environments/development.rb)中,我为我的控制器指定 default_url_options

    config.action_controller.default_url_options = { host: 'localhost', port: 3000 }
    

    然后在我的工人类中,我在那里定义了一个default_url_options 实例方法:

    class Facebook::LikeRecipeWorker
      # ...
    
      private
    
      def default_url_options
        ActionController::Base.default_url_options
      end
    end
    

    【讨论】:

    • 将此标记为答案,因为没有给出其他答案。
    • 我希望有更好的方法。当一个应用程序可以在多个环境中运行时——多个开发人员、staging、qa、beta 服务器等——这是一个必须管理的烦人的配置。如果 Rails 只缓存最后的请求属性并使其随处可访问,那就更好了。
    猜你喜欢
    • 1970-01-01
    • 2013-07-10
    • 2018-11-05
    • 2013-09-16
    • 2012-10-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多