如何为Sidekiq工作者设置default_url_options?

时间:2013-02-17 20:46:57

标签: ruby-on-rails routing worker sidekiq

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

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

我遇到的问题是我的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

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

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

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

2 个答案:

答案 0 :(得分:9)

我们做的是:

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

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

答案 1 :(得分:3)

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

首先,在我的环境文件中(例如: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