2012-10-16 192 views
6

Url(由於不明確的原因,產生不同的問題/沒有真正的優勢)被w3定義爲區分大小寫。Rails routes.rb - 匹配大小寫不敏感

route.rb不區分大小寫的情況下有什麼可能嗎?

這裏的匹配:

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

地址示例:/歐洲/庫/ page4711

呼叫顯示在庫控制器與{動作:富=> 「歐洲」,:巴=>「page4711 「}

我想什麼是兩兩件事:

  • 在p aram值:foo需要一個.downcase,所以/歐洲應該是{0} {0} =>「歐洲」}
  • 庫應該不區分大小寫(即。/Library,/ LIBRARY, /liBRarY都應該匹配)

如何在routes.rb中執行此操作?

謝謝!

+0

也許相關:http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/ –

+0

@shioyama:我終於把它作爲一個寶石:https:// rubygems.org/gems/route_downcaser –

回答

7

好吧,回答我的問題:

還有就是Rails內部的routes.rb做到這一點沒有什麼好辦法。

這裏我所做的:

因爲我在我的控制器創建的before_filter的第一件事:

before_filter :foo_to_lower_case 

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

對於我創建了一個負載均衡規則,讓它小寫Rails應用程序的第二個。當然你也可以定義一個nginx/apache規則。

編輯:我發現第二部分的另一個解決方案,因爲我不喜歡預解析/替換每個url。

我製作了一個符號「庫」,並寫了一個約束,它只接受任何形式的單詞「庫」。

所以在routes.rb中的行看起來像:

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

優化:'params [:foo] .downcase!' – brauliobo

2

要downcase路徑,您可以設置一個初始添加Rack中間件。在這裏,我正在檢查路徑是否以/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' 

重啓軌道,不需要任何配置。 這個項目的github上是:

https://github.com/carstengehling/route_downcaser

按創業板注意「查詢字符串參數和資產路徑不以任何方式改變了。」

+0

不錯,但很高興能更具體 – brauliobo

+1

小心,這個寶石太方便了。 – Shadoath