我有一个传统的rails 3.2应用程序,当我尝试使用none-ascii char命中路由时,例如; example.com/city/bergstraße
然后我收到以下错误:
/Users/user/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/uri/rfc3986_parser.rb:20:in `split'
/Users/user/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/uri/rfc3986_parser.rb:72:in `parse'
/Users/user/.rvm/rubies/ruby-2.2.5/lib/ruby/2.2.0/uri/common.rb:226:in `parse'
actionpack (3.1.0) lib/action_dispatch/routing/redirection.rb:91:in `block in redirection_proc'
rack-mount (0.8.3) lib/rack/mount/route_set.rb:152:in `call'
rack-mount (0.8.3) lib/rack/mount/route_set.rb:152:in `block in call'
...
问题是,我在点击任何控制器之前遇到此错误,所以我只是想知道在哪里可以捕获此错误来解析和修复URL?谢谢。
P.S:在指向我以前的任何帖子之前,请先查看堆栈跟踪。
答案 0 :(得分:2)
根据RFC 3986,URI可能只包含ASCII字符的子集。
要提供有效的URI,应转义非ASCII字符:
irb(main):008:0> URI.parse "example.com/city/#{URI.encode('bergstraße')}"
=> #<URI::Generic example.com/city/bergstra%C3%9Fe>
问题是,我在点击任何控制器之前得到此错误, 所以我只是想知道在哪里可以捕获此错误来解析和修复 URL?
问题是你不应该抓住这个错误。您的rails服务器不应负责响应错误或格式错误的请求。
虽然您可以尝试编写一个中间件来解决问题,但您应该找出客户端发送无效URI请求的原因。
如果它们来自您自己的应用程序,请确保正确地转出slug列,而不仅仅是使用字符串插值创建url。 stringex宝石或friendly_id是您的朋友。