Rails 路由约束和 UTF-8

Rails Routing Constraints and UTF-8

提问人:mu is too short 提问时间:9/20/2013 最后编辑:mu is too short 更新时间:11/1/2013 访问量:738

问:

我需要处理像 .蛞蝓在其他地方受到限制以匹配:/:slug

\A[\p{Alnum}_.-]{3,}\z

显而易见的路线:

get '/:slug' => '...', :constraints => { :slug => /[\p{Alnum}_.-]{3,}/ }
get '/:slug' => '...', :slug => /[\p{Alnum}_.-]{3,}/

与 ASCII URL 一起工作,例如 和 但是当 URL 是 时,一切都会分崩离析。浏览器正在向服务器发送以下内容:/mu-is-too-short/where.is.pancakes.house/µ-is-too-short

/%C2%B5-is-too-short

Rails 正在尝试根据约束检查编码并失败,因为不是 .%C2%B5-is-too-short:slug%\p{Alnum}

我想出了两个小问题:

get '/:slug' => '...', :slug => /.{3,}/
get '/:slug' => '...', :slug => /[^\/]+/, :constraints => lambda { |r| r.path_parameters[:slug].to_s =~ /\A[\p{Alnum}_.-]{3,}\z/ }

第二个是需要 in 来防止 Rails 认为 in 是格式扩展。:slug => /[^\/]+/.ba.b

有没有办法让 Rails 合理地运行并根据约束检查解码,或者我必须松开约束还是手动完成?:slug

ruby-on-rails ruby-on-rails-3 UTF-8 路由

评论

0赞 Mike Szyndel 9/20/2013
所以问题基本上是与约束匹配的参数没有 url 解码,对吗?
0赞 mu is too short 9/21/2013
@MichaelSzyndel:是的。Rails 确实有解码值,但它似乎没有将其用于约束检查。我只需要添加到第二个中,让 Rails 正确地提取一个带有 a 的 slug,这意味着一些关于解析顺序的事情。r.path_parameters[:slug]:slug => /[^\/]+/.
0赞 Mike Szyndel 9/22/2013
看看你的问题,这很明显,但我只是想把它弄清楚。我试着研究一下 Rails 的路由代码,但放弃了。
0赞 Mike Szyndel 9/22/2013
我正在考虑制作一个与所有允许的字母/符号相匹配的正则表达式,但在 utf-8 空间中,这太复杂了。黑名单看起来也不是很有希望。
1赞 onebree 1/2/2016
您可能对 Rails 5 感兴趣,它接受路径名、文件名等中的 utf-8 字符。如果没有,那么尝试找到喵喵字符的十六进制转换,ruby 会处理它

答:

0赞 Houen 11/1/2013 #1

您可以使用 lambda 作为约束,这样可以更改编码(从 http://www.intridea.com/blog/2011/2/21/use-lambdas-for-rails3-route-constraints 开始):

scope :constraints => lambda{|req| !req.session[:user_id].blank? } do
  # all my logged in routes
end

评论

0赞 mu is too short 11/2/2013
不过,这只是我伪装的第二个 kludge ()。我正在寻找一种方法来说服 Rails 明智地行事,并根据它已经拥有的解码路径检查约束。:constraints => lambda { |r| ... }