10

Ruby on Rails のルートでは、大文字と小文字が区別されます。誰かが以前にこれを持ち出したようで、修正されないというラベルが付けられています。

http://rails.lighthouseapp.com/projects/8994/tickets/393-routes-are-case-sensitive

ルートが大文字と小文字を区別するための自分のアプリケーションには利点がまったく見られないため、これは残念なことです.

ルートで大文字と小文字を区別しないようにする最善の方法は何ですか?

Google 検索で次のヒントを見つけました。

map.connect "web_feeds/:action", :controller  => 'web_feeds', :action => /[a-z_]+/i

これは巧妙ですが、依然として URL の web_feeds 部分で大文字と小文字が区別されます。ただし、wEb_feEds の各可能な組み合わせを手動で入力しない限り、これを回避する同様の方法は見当たりませんが、それはさまざまな理由から明らかに恐ろしい解決策です。

4

6 に答える 6

12

URL では大文字と小文字が区別されるため、Rails のルートでは大文字と小文字が区別されます。W3Cから:

一般に、URL は大文字と小文字が区別されます (マシン名を除く)。大文字と小文字を区別しない URL または URL の一部が存在する場合がありますが、これらを特定するのは簡単ではありません。ユーザーは、URL では大文字と小文字が区別されることを常に考慮する必要があります。

于 2010-02-18T20:30:13.123 に答える
7

私はちょうど同じ問題を抱えており、ミドルウェアを使用して解決しました - ここを見てください:

http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/

注: これは Rails 2.3+ にのみ適用されます。

  • カーステン
于 2010-02-27T15:04:53.047 に答える
3

別のアプローチを試すこともできます。ケースをサーバー側に変換し、すべてをレールに小文字で送信します。

mod_rewrite または mod_spelling でこれを達成できると思います。

于 2010-02-18T20:34:36.763 に答える
2

デフォルトで小文字にモンキーパッチするだけです。簡単な例:

module ActionController
  module Caching
    module Pages
      def cache_page(content = nil, options = nil)
        return unless perform_caching && caching_allowed

        path = case options
          when Hash
            url_for(options.merge(:only_path => true, :skip_relative_url_root => true, :format => params[:format]))
          when String
            options
          else
            request.path
        end

        path = path.downcase

        self.class.cache_page(content || response.body, path)
      end
    end
  end
end
于 2010-05-18T22:32:08.070 に答える
2

簡単な解決策は、エレガントな方法ではないかもしれませんが、実行可能な方法です。次のように、アプリケーションコントローラーで before_filter を使用します。

  before_filter :validate_case

  def validate_case
    if request.url != request.url.downcase
      redirect_301_permanent_to request.url.downcase
    end
  end

  def redirect_301_permanent_to(url)
     redirect_to url, :status=>:moved_permanently 
  end

私がすでに言ったように、それはエレガントではありませんが、まだ実行可能であるため、反対票を投じないでください。:P

于 2013-04-17T08:11:10.277 に答える
0

URL では大文字と小文字が区別されますが、ルートで大文字と小文字を区別しないようにしたい場合は、裏技があります。

application_controller.rb に次のように入力します。

rescue_from ActionController::RoutingError do |exception|
 redirect_to request.url.downcase
end

しかし、実際にはそうしないでください。存在しないルートのリダイレクト ループを作成します。request.request_uri をそのコンポーネントに解析し、それらを小文字化し、それらを使用してリダイレクト先の正当なルートを生成する必要があります。すぐに述べたように、これは汚いハックです。ただし、これはルートマップを醜くハックするよりはましだと思います。

于 2010-02-18T22:50:01.957 に答える