7

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

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

我遇到的问题是我的默认 url/端口无法从我的 Sidekiq 工作程序中访问,尽管有各种尝试在我的development.rbor中定义它们production.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会引发 an 消息:

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

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

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

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

4

2 回答 2

9

我们所做的是这样的:

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

 routes.default_url_options = { host: 'www.example.org' }
于 2014-04-15T17:23:25.970 回答
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
于 2013-02-17T21:23:42.627 回答