2013-02-17 14 views
7

私は、ソーシャルアクション(例:Facebookのページに似ています)を行うことを目的としたSidekqワーカーがいます。これの一部には、好きなオブジェクトのURLを知る必要があります。Sidekiqワーカー向けにdefault_url_optionsを設定するにはどうすればよいですか?

幸いにも、Rails 3では、path/urlヘルパーメソッドへのアクセスが必要なクラスまたはモジュールにRails.application.routes.url_helpersを含めることで、アプリケーション固有のルートに簡単にアクセスできます。

私の問題は、私のdevelopment.rbまたはproduction.rbにそれらを定義しようとしているにもかかわらず、私のSidekiqワーカーから私のデフォルトのURL /ポートにアクセスできないということです。

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: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

私は環境固有の設定ファイルで、例えば、ActionControllerまたはActionMailerため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を定義するつもりですか?

答えて

9

これは何ですか:

設定ファイル(config/application.rb、config/production.dbなど)には、デフォルトを設定する行があります。

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

あなたの回答はあなたのものに変わるのは明らかです。ありがとう! –

3

これに潜在的な解決策が見つかりましたが、ハックのようなものです。私は間違いなくより良い答えに開いています。

まず、私の環境ファイル(例:config/environments/development.rb)で、私は私のコントローラのdefault_url_optionsを指定:

class Facebook::LikeRecipeWorker 
    # ... 

    private 

    def default_url_options 
    ActionController::Base.default_url_options 
    end 
end 

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

その後、私のワーカークラスでは、私はそこdefault_url_optionsインスタンスメソッドを定義します

+0

他の回答はありませんので、これを答えとしてマークしてください。 –

+0

もっと良い方法があるといいですね。アプリケーションが複数の環境(複数の開発者、ステージング、qa、ベータサーバーなど)で実行できるとき、これは管理しなければならない厄介な設定です。 Railsが最後のリクエストattrsをキャッシュしてどこにでもアクセスできるようにするのはずっと良いでしょう。 –

+0

@ paulnsorensenの答えはより正確です – Jeriko

関連する問題