Rails Routes - Как сделать их нечувствительными к регистру? - PullRequest
9 голосов
/ 18 февраля 2010

Маршруты в 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

Это умно, но все же оставляет часть web_feeds в URL чувствительной к регистру.Однако я не вижу в этом подобного подхода, если не вводить каждую возможную комбинацию wEb_feEds вручную, но это, очевидно, ужасное решение по ряду причин.

Ответы [ 6 ]

11 голосов
/ 18 февраля 2010

Маршруты в Rails чувствительны к регистру, потому что URL чувствительны к регистру.В URL-адресах W3C :

обычно учитывается регистр (за исключением имен компьютеров).Там могут быть URL-адреса или части URL-адресов, где регистр не имеет значения, но определить их может быть непросто.Пользователи всегда должны учитывать, что URL-адреса чувствительны к регистру.

7 голосов
/ 27 февраля 2010

У меня просто та же проблема, и я решил ее с помощью промежуточного программного обеспечения - посмотрите здесь:

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

Примечание: это относится только к Rails 2.3 +

  • Карстен
3 голосов
/ 18 февраля 2010

Ну, вы можете попробовать другой подход. Сделайте так, чтобы сервер трансформировался и отправил все на рельсы вниз.

Я думаю, что вы можете достичь этого с помощью mod_rewrite или mod_spelling.

2 голосов
/ 17 апреля 2013

Простое решение может быть не элегантным, но все же работоспособным: Используйте 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

2 голосов
/ 19 мая 2010

просто обезьяна-патч по умолчанию. простой пример:

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
0 голосов
/ 19 февраля 2010

Несмотря на то, что URL-адреса чувствительны к регистру, если вы хотите, чтобы в маршрутах не учитывался регистр, вы можете использовать грязный хак.

В application_controller.rb положить:

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

Но на самом деле не делай этого. Вы создаете цикл перенаправления для любых несуществующих маршрутов. Вы действительно должны разобрать request.request_uri в его компонентах, поместить их в нижний регистр и использовать их для генерации правильного маршрута, на который вы перенаправляете. Как я уже говорил, это грязный хак. Тем не менее, я думаю, что это лучше, чем делать вашу карту маршрутов уродливой и хакерской.

...