2013-02-17 9 views
7

मेरे पास एक साइडकीक कार्यकर्ता है जिसका उद्देश्य सामाजिक कार्यवाही करना है (उदाहरण: फेसबुक पर पृष्ठों की तरह)। इसके भाग को ऑब्जेक्ट पसंद होने के लिए यूआरएल जानने की आवश्यकता है।मैं साइडकीक श्रमिकों के लिए default_url_options कैसे सेट कर सकता हूं?

सौभाग्य से, रेल 3 किसी भी कक्षा या मॉड्यूल में पथ/यूआरएल सहायक विधि तक पहुंच की आवश्यकता वाले Rails.application.routes.url_helpers सहित ऐप-विशिष्ट मार्गों तक पहुंच बनाना आसान बनाता है।

जिस समस्या में मैं चल रहा हूं वह यह है कि मेरे 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: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

मुझे पता है कि मैं ActionController या ActionMailer वातावरण-विशिष्ट config फ़ाइलें, जैसे में के लिए default_url_options निर्दिष्ट कर सकते हैं:

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

हालांकि, इन (सही ढंग से) पर कोई प्रभाव नहीं पड़ता मेरे साइडकीक कार्यकर्ता वर्ग। इन कक्षाओं के लिए मुझे 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

मेरी इच्छा है कि एक बेहतर तरीका था। जब एक ऐप कई वातावरणों में चलाया जा सकता है - एकाधिक डेवलपर्स, स्टेजिंग, क्यूए, बीटा सर्वर इत्यादि - यह प्रबंधन करने के लिए एक परेशान कॉन्फ़िगरेशन है। यह बहुत बेहतर होगा अगर रेल सिर्फ अंतिम अनुरोध atters को कैश करेगा और इसे हर जगह सुलभ बना देगा। –

+0

@ paulnsorensen का उत्तर अधिक सही है – Jeriko

संबंधित मुद्दे