2012-10-16 46 views
6

URLは(不明瞭な理由で、異なる問題を生成します/実際の利点はありません)、w3によって大文字と小文字が区別されます。Rails routes.rb - 大文字と小文字は区別されません。

routes.rbの大文字と小文字は区別されません。ここで

マッチング:

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

のURL例:FOO => "ヨーロッパ":バー=>「page4711 /ヨーロッパ/ライブラリ/ page4711

コールが{とライブラリコントローラにおけるアクションを示します

  • P: "}私が欲しいもの

    は2つのことですaramの値:fooは.downcaseを必要とするので、ヨーロッパは{ :foo => "europe"}になります。

  • ライブラリは大文字と小文字を区別しないようにする必要があります。 /ライブラリ、/ライブラリ、 /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

OK]をクリックして、自分の質問に答えるために:

はRailsのroutes.rbを内にこれを行うには良い方法はありません。

私が何をしたか。ここ

私は私のコントローラでbefore_filterを作成した最初の事について:私はそれがレールのアプリに小文字取得するには、ロードバランサのルールを作成した1秒間

before_filter :foo_to_lower_case 

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

。もちろん、代わりにnginx/apacheルールを定義することもできます。

編集:私はすべてのURLの事前解析/置換が嫌いだったので、2番目の部分の別の解決策を見つけました。

私はシンボルに "ライブラリ"を作り、 "ライブラリ"という言葉だけを受け入れるための制約を書いています。

だから、routes.rbを内の行は次のようになります。パスをdowncaseするに

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

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

2

、あなたはラックミドルウェアを追加するための初期化子を設定することができます。ここでは、パスが/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

関連する問題