提问人:mu is too short 提问时间:9/20/2013 最后编辑:mu is too short 更新时间:11/1/2013 访问量:738
Rails 路由约束和 UTF-8
Rails Routing Constraints and UTF-8
问:
我需要处理像 .蛞蝓在其他地方受到限制以匹配:/: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 => /[^\/]+/
.b
a.b
有没有办法让 Rails 合理地运行并根据约束检查解码,或者我必须松开约束还是手动完成?:slug
答:
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| ... }
评论
r.path_parameters[:slug]
:slug => /[^\/]+/
.