Rails路由 – 如何使它们不区分大小写?

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组合,但这显然是一个可怕的解决方案,无论多种原因。

我只是遇到了同样的问题,并使用中间件解决了它 – 看看这里:

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

注意:这仅适用于Rails 2.3+

  • 卡斯滕

Rails中的路由区分大小写,因为URL区分大小写。 来自W3C :

URL通常区分大小写(机器名称除外)。 可能存在URL或URL的一部分,其中大小写无关紧要,但识别这些可能并不容易。 用户应始终认为URL区分大小写。

那么你可以尝试另一种方法。 使case转换serveride并将所有内容发送到rails downcase。

我认为你可以使用mod_rewrite或mod_spelling来实现这一点。

只是猴子 – 默认情况下将其修补为小写。 简单的例子:

 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 

一个简单的解决方案可能不是一种优雅的方式,但可行的方法是:在应用程序控制器中使用这样的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

虽然URL区分大小写,但如果您希望使路由不区分大小写,那么您可以执行脏操作。

在application_controller.rb中放:

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

但实际上并没有这样做。 您可以为任何不存在的路由创建重定向循环。 你真的应该将request.request_uri解析为它的组件,对它们进行整理,并使用它们来生成你重定向到的合法路由。 正如我刚才提到的,这是一个肮脏的黑客。 但是,我认为这比使你的路线图丑陋和黑客更好。