如何为Sidekiq工作者设置默认的url选项?

7
我有一个Sidekiq工作进程,旨在执行社交操作(例如:在Facebook上点赞页面)。其中一部分需要知道被点赞对象的URL。
幸运的是,Rails 3通过在需要访问路径/ URL助手方法的任何类或模块中包含“Rails.application.routes.url_helpers”使访问应用程序特定路由变得容易。
我遇到的问题是,尽管尝试在我的“development.rb”或“production.rb”中定义默认的url/port,但它们无法从我的Sidekiq工作进程中访问。
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

2个回答

9
我们所做的是:
在您的配置文件中(例如:config/application.rb、config/production.db等),添加一行设置默认值的代码:
 routes.default_url_options = { host: 'www.example.org' }

将已接受的答案更改为您的答案,因为显然对人们来说效果更好。谢谢! - Matt Huggins

3
我找到了一个潜在的解决方案,但感觉有点像是一个小技巧。我非常希望能够获得更好的答案。
首先,在我的环境文件中(例如: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

将此标记为答案,因为没有给出其他答案。 - Matt Huggins
我希望有更好的方法。 当一个应用程序可以在多个环境中运行--多个开发人员,暂存,质量保证,beta服务器等--这是一种烦人的配置需要管理。如果Rails只需缓存上次请求属性并使其随处可访问,那将会更好。 - Michael Johnston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接