ruby-on-rails - Rails路由约束和UTF-8

标签 ruby-on-rails ruby-on-rails-3 utf-8 routing

我需要处理类似/: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/

相关文章:

javascript - 通过 $scope 访问函数中的 ng-resource 会导致无限循环

ruby-on-rails-3 - 将列类型从字符变化更改为不带时区的时间戳

python - 混合使用 UTF-8 和 ASCII 编码?

XML UTF-8 数据的写入方式不同

wordpress - 输入希伯来语时,PayPal 捐赠说明显示断线字符

ruby-on-rails - 测试设计使用 Rspec 更新用户注册信息并获取:ActionController::UnknownFormat: Error

ruby-on-rails - 你如何在 Rails 中使用 Rspec 测试你的配置/初始化脚本?

ruby-on-rails - 如何在S3中存储数据并允许用户使用rails API/iOS客户端以安全的方式访问?

paperclip - 附件_fu 或 Rails3 的回形针

ruby - rails sti 和命名空间重复模型名称