我有一个Sidekiq工作者,旨在执行社交活动(例如:Facebook上的类似页面)。部分原因是需要知道所喜欢对象的URL。
幸运的是,通过在任何需要访问路径/ url帮助方法的类或模块中包含Rails.application.routes.url_helpers
,Rails 3可以轻松访问特定于应用程序的路由。
我遇到的问题是我的Sidekiq工作人员无法访问我的默认网址/端口,尽管我在development.rb
或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
并显示以下消息:
ArgumentError:缺少要链接的主机!请提供:host参数,设置default_url_options [:host],或将:only_path设置为true
我知道我可以在特定于环境的配置文件中为default_url_options
或ActionController
指定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
?
答案 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