网址(由于不明原因,产生不同的问题/没有真正的优势)由w3定义为区分大小写。
我对routes.rb匹配大小写不敏感的可能性是什么?
这里匹配:
match '/:foo/library/:bar' => 'library#show'
网址示例:/ europe / library / page4711
使用{:foo =>调用库控制器中的show动作“europe”,:bar => “page4711”}
我想要的是两件事:
我如何在routes.rb中执行此操作?
谢谢!
答案 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)