ruby-on-rails 如何使它们不区分大小写?

ndasle7k  于 2023-01-27  发布在  Ruby
关注(0)|答案(7)|浏览(151)

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

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

plupiseo

plupiseo1#

Rails中的路由是区分大小写的,因为URL是区分大小写的。
URL通常是区分大小写的(计算机名称除外)。可能有URL或URL的某些部分不区分大小写,但识别它们可能并不容易。用户应始终考虑URL是区分大小写的。

mutmk8jj

mutmk8jj2#

我刚刚遇到了同样的问题,并使用中间件解决了它-看看这里:
http://gehling.dk/2010/02/how-to-make-rails-routing-case-insensitive/
注意:这仅适用于Rails 2.3+

  • 卡斯滕
w80xi6nr

w80xi6nr3#

你可以尝试另一种方法,把case转换到服务器端,然后把所有的东西都发送到rails downcase。
我想你可以用mod_rewrite或者mod_spelling来实现这一点。

u4dcyp6a

u4dcyp6a4#

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

tjrkku2a

tjrkku2a5#

只需在默认情况下将其修改为小写即可。简单示例:

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
qfe3c7zg

qfe3c7zg6#

虽然URL是区分大小写的,但如果你想让你的路由不区分大小写,你可以做一个肮脏的黑客。
在application_controller.rb中输入:

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

但实际上不要这样做。你为任何不存在的路由创建了一个重定向循环。你真的应该把request.request_uri解析成它的组件,把它们小写,然后用它们来生成你重定向到的合法路由。正如我刚才提到的,这是一个肮脏的黑客行为。但是,我认为这比让你的路由图变得丑陋和黑客行为要好。

pgvzfuti

pgvzfuti7#

(多年后发布)
如果您只想寻找不区分大小写的特定路由,就像我的例子一样,那么我最终会做以下事情。
假设您的路线是

get "items/:id" => "item#show"

这将解析/item/123,但不能解析/ITEM/123Item/123
您可以使用一个段约束,将item作为一个参数,并添加一个默认值,这样您的路线帮助器就不需要指定它(因此保持它们与上面的原始路线相同):

get ":item/:id", constraints: { item: /item/i }, defaults: { item: "item" }  => "item#show"

如果您在/item下有多个路由,您可以将此概念概括为一个范围:

scope ":item/", constraints: { item: /item/i }, defaults: { item: "item" } do
  get "/:id" => "item#show"
  delete "/:id" => "item#destroy"
end

相关问题