0

我的 Sinatra 应用程序中有这个过滤器:

before '/:locale/*' do
  # stuff...
  request.path_info = params[:splat]
end

换句话说,我只想获取 URL 的区域设置部分,然后让应用程序继续运行,就好像它不存在一样。(当然在渲染视图时使用语言环境。)

这在 Ruby 1.8.7 下可以正常工作,但在 >=1.9 时会中断,因为 splat 现在是一个包含一个项目的数组,而不仅仅是一个字符串。我不得不使用params[:splat].first它来使它工作。

我的问题只是这种差异来自哪里。它只是一个 Ruby 1.8 与 1.9 的东西吗?或者 Sinatra 是否以某种方式参与其中?

只是希望将来能够更轻松地修复这种事情。

4

1 回答 1

2

Sinatra 文档似乎表明 params[:splat] 可以是字符串或数组,因此您可以执行以下操作来处理任何一种情况:

request.path_info = [*params[:splat]].first

我在这里演示:

$ cat splat.rb
[ { :splat => [ "/foo" ] }, { :splat => "/foo" } ].each do |params|
    path_info = [*params[:splat]].first
    puts "#{path_info} (#{path_info.class})"
end
$ ruby1.8 splat.rb
/foo (String)
/foo (String)
$ ruby1.9.1 splat.rb
/foo (String)
/foo (String)
于 2012-04-17T22:50:29.527 回答