2013-02-17 13 views
7

Ho un lavoratore Sidekiq destinato a svolgere azioni sociali (ad es. Pagine simili su Facebook). Parte di questo richiede la conoscenza dell'URL per l'oggetto che è piaciuto.Come posso impostare default_url_options per i lavoratori Sidekiq?

Fortunatamente, Rails 3 semplifica l'accesso ai percorsi specifici delle app includendo Rails.application.routes.url_helpers in qualsiasi classe o modulo che ha bisogno di accedere al metodo path/url helper.

Il problema che sto funzionando in è che il mio difetto url/porto non sono accessibili da dentro il mio lavoratore Sidekiq nonostante i vari tentativi di definire loro nella mia development.rb o 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 

Quando il metodo recipe_url è gratuita, una ArgumentError è sollevata con il messaggio:

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

so che posso specificare default_url_options per ActionController o ActionMailer nei file di configurazione specifici dell'ambiente, ad esempio:

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

Tuttavia, questi (a buon diritto) sembrano non avere alcuna influenza le mie classi di lavoratori Sidekiq. Come dovrei andare a definire default_url_options per queste classi?

risposta

9

Quello che abbiamo fatto è stato questo:

Nei file di configurazione (ad es. Config/application.rb, config/production.db, ecc.), avere una linea che imposta il valore predefinito:

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

Cambiare la risposta accettata alla tua poiché ovviamente sta funzionando meglio per le persone. Grazie! –

3

Ho trovato una soluzione potenziale a questo, anche se sembra un po 'un trucco. Sono decisamente aperto a risposte migliori.

In primo luogo, nei miei file di ambiente (ad esempio: config/environments/development.rb), specificare l'default_url_options per i miei controllori:

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

Poi nella mia classe lavoratrice, ho definire un metodo default_url_options esempio ci:

class Facebook::LikeRecipeWorker 
    # ... 

    private 

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

Contrassegnare questo come risposta poiché non sono state fornite altre risposte. –

+0

Vorrei che ci fosse un modo migliore. Quando un'applicazione può essere eseguita in diversi ambienti - più sviluppatori, staging, qa, beta server, ecc. - questa è una configurazione noiosa da gestire. Sarebbe molto meglio se Rails si limitasse a mettere in cache l'ultima richiesta attrs e la rendesse accessibile ovunque. –

+0

@ la risposta di paulnsorensen è più corretta – Jeriko

Problemi correlati