我需要处理类似/:slug
的路由。这些子弹在其他地方受约束以匹配:
\A[\p{Alnum}_.-]{3,}\z
显而易见的路线:
get '/:slug' => '...', :constraints => { :slug => /[\p{Alnum}_.-]{3,}/ }
get '/:slug' => '...', :slug => /[\p{Alnum}_.-]{3,}/
可以与
/mu-is-too-short
和/where.is.pancakes.house
这样的ASCII URL一起很好地工作,但是当URL为/µ-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/ }
第二个中的
:slug => /[^\/]+/
是必需的,以防止Rails认为.b
中的a.b
是格式扩展。有没有一种方法可以使Rails表现得合理,并对照约束检查解码的
:slug
,还是必须放松约束或手动完成约束?
最佳答案
您可以将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
关于ruby-on-rails - Rails路由约束和UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18905707/