Rails routes.rb - 匹配大小写不敏感

时间:2012-10-16 14:04:22

标签: ruby-on-rails routes

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

我对routes.rb匹配大小写不敏感的可能性是什么?

这里匹配:

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

网址示例:/ europe / library / page4711

使用{:foo =>调用库控制器中的show动作“europe”,:bar => “page4711”}

我想要的是两件事:

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

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

谢谢!

3 个答案:

答案 0 :(得分: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规则。

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

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

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

match '/:foo/:library/:bar' => 'library#show', :constraints => { :library => /library/i }

答案 1 :(得分:3)

只需将其添加到您的Gemfile

即可
gem 'route_downcaser'

重新启动rails,无需配置。 该项目的github位于:

https://github.com/carstengehling/route_downcaser

正如gem中所述,“Querystring参数和资产路径不会以任何方式改变。”

答案 2 :(得分: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)