2012-10-16 13 views
6

यूआरएल (एक अस्पष्ट कारण के लिए, विभिन्न समस्याओं/वास्तविक लाभ उत्पन्न) डब्ल्यू 3 द्वारा संवेदनशील केस परिभाषित हैं।रेल मार्ग। आरबी - मिलान मामले असंवेदनशील

मार्गों में मेरी संभावनाएं क्या हैं। आरबी मैच केस असंवेदनशील रूप से?

यहाँ

मिलान:

match '/:foo/library/:bar' => 'library#show' 

यूआरएल उदाहरण: foo => "यूरोप",: बार => "page4711/यूरोप/पुस्तकालय/page4711

कॉल {साथ पुस्तकालय नियंत्रक में कार्रवाई दिखाने

  • पी: "}

    मैं क्या चाहता हूँ 2 बातें कर रहे हैं aram value: foo को .downcase की आवश्यकता है ताकि यूरोप { : foo => "europe"}

  • लाइब्रेरी को असंवेदनशील रूप से मामला मिलना चाहिए (यानी।/लाइब्रेरी,/पुस्तकालय, /liBRarY सभी को मेल खाना चाहिए)

मैं रूट.आरबी में यह कैसे कर सकता हूं?

धन्यवाद!

+0

शायद प्रासंगिक: http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/ –

+0

@shioyama: मुझे अंत में इसे एक मणि के रूप में बनाना है: https: // rubygems.org/gems/route_downcaser –

उत्तर

7

ठीक है, मेरे अपने सवाल का जवाब देने:

रेल routes.rb भीतर ऐसा करने के लिए कोई अच्छा तरीका नहीं है।

मैं यहाँ क्या किया:

पहली बात मैं अपने नियंत्रक में एक before_filter बनाया के लिए:

before_filter :foo_to_lower_case 

def foo_to_lower_case 
    params[:foo] = params[:foo].downcase 
end 

दूसरा एक मैं एक लोड संतुलन नियम बनाया यह पटरियों एप्लिकेशन को लोअरकेस पाने के लिए के लिए । बेशक आप इसके बजाय एक nginx/apache नियम भी परिभाषित कर सकते हैं।

संपादित करें: मुझे दूसरे भाग के लिए एक और समाधान मिला क्योंकि मैंने प्रत्येक यूआरएल के प्री-पार्सिंग/प्रतिस्थापन को नापसंद किया था।

मैंने एक प्रतीक के लिए "पुस्तकालय" बनाया और इसके लिए एक बाध्य लिखा जो केवल "पुस्तकालय" शब्द का किसी भी रूप को स्वीकार करता है।

तो routes.rb में लाइन की तरह दिखता है:

match '/:foo/:library/:bar' => 'library#show', :constraints => { :library => /library/i } 
+0

अनुकूलन: 'पैराम्स [: foo] .downcase! ' – brauliobo

2

पथ downcase लिए, आप एक रैक मिडलवेयर जोड़ने के लिए एक प्रारंभकर्ता सेट कर सकते हैं। यहां मैं जांच रहा हूं कि पथ /posts और posts के साथ शुरू होता है या नहीं, यह लंबे शब्द का हिस्सा नहीं है। अधिक जानकारी के लिए कोड टिप्पणियां देखें।

class PathModifier 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if env['PATH_INFO'] =~ /^\/posts\b/i 
     Rails.logger.debug("modifying path") 
     %w(PATH_INFO REQUEST_URI REQUEST_PATH ORIGINAL_FULLPATH).each do |header_name| 
     # This naively downcases the entire String. You may want to split it and downcase 
     # selectively. REQUEST_URI has the full url, so be careful with modifying it. 
     env[header_name].downcase! 
     end 
    end 
    @app.call(env) 
    end 
end 
Rails.configuration.middleware.insert(0, PathModifier) 
3

बस अपने Gemfile

gem 'route_downcaser' 

पुनः आरंभ रेल, कोई विन्यास की जरूरत में जोड़ना।

https://github.com/carstengehling/route_downcaser

मणि में बताया गया है "पैरामीटर और परिसंपत्ति रास्तों क्वेरी स्ट्रिंग किसी भी तरह से नहीं बदला गया है।": इस परियोजना के लिए GitHub पर है

+0

अच्छा है, लेकिन अधिक विशिष्ट होना चाहिए – brauliobo

+1

सावधान, यह मणि उपयोग करने के लिए बहुत आसान तरीका है। – Shadoath

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