6

URLは、w3で大文字と小文字が区別されるように定義されています(理由は不明ですが、さまざまな問題が発生します/実際の利点はありません)。

Routes.rbマッチケースでの私の可能性は何ですか?

ここでマッチング:

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

URLの例:/ europe / library / page4711

{:foo => "europe"、:bar => "page4711"}を使用して、ライブラリコントローラーでshowactionを呼び出します。

私が欲しいのは2つのことです:

  • :fooのparam値には.downcaseが必要なので、/ Europeは{:foo=>"europe"}である必要があります。
  • ライブラリは大文字と小文字を区別せずに一致させる必要があります(つまり、/ Library、/ LIBRARY、/ liBRarYはすべて一致する必要があります)

これをroutes.rbで行うにはどうすればよいですか?

ありがとう!

4

3 に答える 3

7

わかりました、私自身の質問に答えるために:

Railsroutes.rb内でこれを行う良い方法はありません。

ここで私がしたこと:

まず、コントローラーでbefore_filterを作成しました。

before_filter :foo_to_lower_case

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

2つ目は、ロードバランサールールを作成して、レールアプリに小文字で表示します。もちろん、代わりにnginx/apacheルールを定義することもできます。

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

私はシンボルに「ライブラリ」を作成し、「ライブラリ」という単語の任意の形式のみを受け入れる制約を記述しました。

したがって、routes.rbの行は次のようになります。

match '/:foo/:library/:bar' => 'library#show', :constraints => { :library => /library/i }
于 2012-10-16T15:21:07.833 に答える
3

これをGemfileに追加するだけです

gem 'route_downcaser'

レールを再起動します。構成は必要ありません。このプロジェクトのgithubは次の場所にあります。

https://github.com/carstengehling/route_downcaser

gemに記載されているように、「クエリ文字列パラメータとアセットパスはまったく変更されません。」

于 2014-03-14T13:19:42.487 に答える
2

パスをダウンケース化するために、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)
于 2012-10-16T17:05:12.660 に答える