作为数组或字符串Splat取决于Ruby版本?

时间:2012-04-17 22:21:31

标签: ruby sinatra ruby-1.9

我的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 vs 1.9的东西吗?或者是Sinatra以某种方式参与其中?

希望将来能够更轻松地解决这类问题。

1 个答案:

答案 0 :(得分:2)

Sinatra doc似乎表明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)