10

Ruby on Rails 中的路由区分大小写。好像以前有人提出过这个问题,并且被标记为不会修复。

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

这让我感到很不幸,因为我并没有真正看到我自己的应用程序对区分大小写的路由有任何好处,而在我看来,它会造成混淆的可能性和总体上缺乏修饰的外观。

使我的路线不区分大小写的最佳方法是什么?

我在谷歌搜索中找到了这个提示:

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

这很聪明,但它仍然使 url 的 web_feeds 部分区分大小写。但是,如果不手动输入 wEb_feEds 的每个可能组合,我看不到任何类似的方法,但这显然是一个可怕的解决方案,原因有很多。

4

6 回答 6

12

Rails 中的路由区分大小写,因为 URL 区分大小写。来自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

那么你可以尝试另一种方法。使案例转换服务器端并将所有内容发送到rails downcase。

我认为您可以使用 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 是区分大小写的,但如果你想让你的路由不区分大小写,你可以做一个肮脏的 hack。

在 application_controller.rb 放:

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

但实际上不要那样做。您为任何不存在的路由创建一个重定向循环。您确实应该将 request.request_uri 解析为其组件,将它们小写,并使用它们来生成您重定向到的合法路由。正如我马上提到的,这是一个肮脏的黑客。但是,我认为这比让您的路线图变得丑陋和骇人听闻要好。

于 2010-02-18T22:50:01.957 回答