6

网址(由于不清楚的原因,会产生不同的问题/没有真正的优势)由 w3 定义区分大小写。

我在 routes.rb 中不区分大小写的可能性是什么?

这里匹配:

match '/:foo/library/:bar' => 'library#show'

网址示例:/europe/library/page4711

使用 { :foo => "europe", :bar => "page4711" } 在库控制器中调用显示操作

我想要的是两件事:

  • :foo 的参数值需要一个 .downcase 所以 /Europe 应该是 { :foo => "europe" }
  • 库应该不区分大小写(即 /Library、/LIBRARY、/liBRarY 都应该匹配)

如何在 routes.rb 中执行此操作?

谢谢!

4

3 回答 3

7

好的,回答我自己的问题:

在 Rails routes.rb 中没有很好的方法来做到这一点。

这是我所做的:

首先,我在控制器中创建了一个 before_filter:

before_filter :foo_to_lower_case

def foo_to_lower_case
  params[:foo] = params[:foo].downcase
end

对于第二个,我创建了一个负载均衡器规则以将其小写到 rails 应用程序。当然,您也可以定义一个 nginx/apache 规则。

编辑:我为第二部分找到了另一个解决方案,因为我不喜欢每个 url 的预解析/替换。

我为一个符号制作了“库”,并为它写了一个约束,它只接受“库”这个词的任何形式。

所以 routes.rb 中的行看起来像:

match '/:foo/:library/:bar' => 'library#show', :constraints => { :library => /library/i }
于 2012-10-16T15:21:07.833 回答
3

只需将其添加到您的 Gemfile

gem 'route_downcaser'

重启rails,不需要配置。该项目的 github 位于:

https://github.com/carstengehling/route_downcaser

如 gem 中所述,“查询字符串参数和资产路径不会以任何方式更改。”

于 2014-03-14T13:19:42.487 回答
2

要缩小路径,您可以设置一个初始化程序来添加一个 Rack 中间件。在这里,我正在检查路径是否以更长的单词开头/posts并且posts不是更长单词的一部分。有关更多信息,请参阅代码注释。

class PathModifier
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['PATH_INFO'] =~ /^\/posts\b/i
      Rails.logger.debug("modifying path")
      %w(PATH_INFO REQUEST_URI REQUEST_PATH ORIGINAL_FULLPATH).each do |header_name|
        # This naively downcases the entire String. You may want to split it and downcase
        # selectively. REQUEST_URI has the full url, so be careful with modifying it.
        env[header_name].downcase!
      end
    end
    @app.call(env)
  end
end
Rails.configuration.middleware.insert(0, PathModifier)
于 2012-10-16T17:05:12.660 回答