2008-09-24 19 views
7

मैं एक विधि same_url बुलाया इच्छुक रहा हूँ? यदि पारित यूआरएल बराबर हैं तो यह सच हो जाएगा। पारित यूआरएल या तो पैरा विकल्प विकल्प हैश या तार हो सकता है।रेल में सबसे अच्छा तरीका निर्धारित करने के लिए (तार या हैश विकल्प के रूप में) दो (या अधिक) दिए गए यूआरएल के बराबर हैं क्या है?

same_url?({:controller => :foo, :action => :bar}, "http://www.example.com/foo/bar") # => true 

रेल फ्रेमवर्क सहायक current_page? एक अच्छा प्रारंभिक बिंदु की तरह लगता है, लेकिन मैं यूआरएल की एक मनमाना संख्या में पारित करने के लिए करना चाहते हैं।

एक अतिरिक्त बोनस के यह अच्छा होगा अगर पैरामीटर के हैश को बाहर करने से तुलना में पारित किया जा सकता है के रूप में तो एक विधि कॉल लग सकती है:।

same_url?(projects_path(:page => 2), "projects?page=3", :excluding => :page) # => true 
+0

मैं अपने उदाहरण में देख रहा हूँ आप एक स्ट्रिंग यूआरएल पारित किया जा रहा है, लेकिन आप अभी भी पृष्ठ पैरामीटर खत्म करने के लिए बाहर रखा की उम्मीद है। मैं रूटिंग मॉड्यूल का उपयोग करके इसे हैश में पार्स कर दूंगा, और केवल हैश के साथ काम करता हूं। रेल की – kch

उत्तर

1

इस बात की तरह है कि आप ' फिर के बाद?

def same_url?(one, two) 
    url_for(one) == url_for(two) 
end 
5

यहाँ विधि (environment.rb में/lib में यह डाट और यह आवश्यकता होती है):

def same_page?(a, b, params_to_exclude = {}) 
    if a.respond_to?(:except) && b.respond_to?(:except) 
    url_for(a.except(params_to_exclude)) == url_for(b.except(params_to_exclude)) 
    else 
    url_for(a) == url_for(b) 
    end 
end 

आप ऑन रेल्स हैं पूर्व 2.0.1, आप भी जोड़ने की जरूरत except सहायक विधि हैश:

class Hash 
    # Usage { :a => 1, :b => 2, :c => 3}.except(:a) -> { :b => 2, :c => 3} 
    def except(*keys) 
    self.reject { |k,v| 
     keys.include? k.to_sym 
    } 
    end 
end 

की रेल (अच्छी तरह से, ActiveSupport) except पहले से ही शामिल हैं (क्रेडिट बाद में संस्करण: Brian Guthrie)

+0

नए संस्करण पहले से ही सहायक आप (छोड़कर) से ऊपर के अधिकारी को क्रियान्वित किया है; इसे फिर से जोड़ने के लिए यह अनावश्यक हो सकता है। –

0
def all_urls_same_as_current? *params_for_urls 
    params_for_urls.map do |a_url_hash| 
    url_for a_url_hash.except(*exclude_keys) 
    end.all? do |a_url_str| 
    a_url_str == request.request_uri 
    end 
end 

जिसमें:

  • params_for_urls url पैरामीटर की हैश की एक सरणी (प्रत्येक सरणी प्रविष्टि है एक यूआरएल) का निर्माण करने के
  • exclude_keys चाबियाँ आप चाहते हैं के लिए प्रतीकों की एक सरणी है पैरामीटर हैं अनदेखी करने के लिए
  • request.request_uri नहीं हो सकता है आप वास्तव में क्या इस्तेमाल करना चाहिए, नीचे देखें।

    • आप डोमेन, बंदरगाह के साथ पूर्ण uri तुलना करना चाहते हैं करते हैं और सभी, या:

    तो फिर वहाँ आप जब अपने संस्करण को लागू करने पर विचार करेंगे कि चीजों के सभी प्रकार के कर रहे हैं राह?

  • अगर सिर्फ पथ, आप अभी भी प्रश्न चिह्न के बाद पारित कर दिया तर्कों की तुलना करना चाहते हैं या करते हैं सिर्फ उन है कि वास्तविक पथ पथ रचना?