2013-02-17 7 views
7

Ich habe eine Sidekiq Worker, die soziale Aktionen ausführen soll (z. B. wie Seiten auf Facebook). Ein Teil davon erfordert die Kenntnis der URL für das Objekt, das gemocht wird.Wie kann ich default_url_options für Sidekiq-Mitarbeiter festlegen?

Glücklicherweise macht es Rails 3 leicht, auf appspezifische Routen zuzugreifen, indem Rails.application.routes.url_helpers in welcher Klasse oder in welchem ​​Modul auch immer Zugriff auf die Pfad-/URL-Hilfsmethode verwendet wird.

Das Problem, das ich renne ist, dass meine Standard-URL/Port nicht von meinem Sidekiq Worker trotz verschiedener Versuche, sie in meinem development.rb oder production.rb zu definieren zugegriffen werden kann.

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 

Wenn die recipe_url Methode Zugriff ist, wird ein ArgumentError mit der Meldung erhöht:

ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

Ich weiß, dass ich default_url_options für ActionController oder ActionMailer in den umgebungsspezifischen Konfigurationsdateien angeben kann, zB:

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

Allerdings scheinen diese (zu Recht) keinen Einfluss auf meine Sidekiq-Arbeiterklassen. Wie sollte ich default_url_options für diese Klassen definieren?

Antwort

9

Was wir getan haben, war dies:

In Ihrer Config-Datei (s) (zB config/application.rb, config/production.db, etc.), habe eine Zeile, die den Standardwert festlegt:

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

Ändern der akzeptierten Antwort auf Ihre, da es offensichtlich besser für Menschen funktioniert. Vielen Dank! –

3

Ich habe eine mögliche Lösung gefunden, obwohl es sich anfühlt wie ein bisschen wie ein Hack. Ich bin definitiv offen für bessere Antworten.

Zuerst in meiner Umgebung Dateien (zB: config/environments/development.rb), gebe ich die default_url_options für meinen Controller:

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

Da ist in meinem Arbeiter Klasse definiere ich eine default_url_options Instanzmethode gibt:

class Facebook::LikeRecipeWorker 
    # ... 

    private 

    def default_url_options 
    ActionController::Base.default_url_options 
    end 
end 
+0

Markieren Sie dies als die Antwort, da keine anderen Antworten gegeben wurden. –

+0

Ich wünschte, es gäbe einen besseren Weg. Wenn eine App in mehreren Umgebungen laufen kann - mehrere Entwickler, Staging, qa, Beta-Server, usw. - ist dies eine lästige Konfiguration, die man verwalten muss. Es wäre so viel besser, wenn Rails nur die letzten Request-Attras zwischenspeichern und überall zugänglich machen würde. –

+0

@ paulnsorensens Antwort ist korrekter – Jeriko