首页 文章

如何为Sidekiq工作者设置default_url_options?

提问于
浏览
7

我有一个Sidekiq工作者,旨在执行社交活动(例如:Facebook上的类似页面) . 部分原因是需要知道所喜欢对象的URL .

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

我遇到的问题是我的Sidekiq工作人员无法访问我的默认URL /端口,尽管我在 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 Worker 阶级没有影响 . 我该如何为这些类定义 default_url_options

2 回答

  • 3

    我们做的是这样的:

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

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

    我发现了一个潜在的解决方案,虽然感觉有点像黑客 . 我肯定愿意接受更好的答案 .

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

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

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

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

相关问题