我的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以某种方式参与其中?
希望将来能够更轻松地解决这类问题。
答案 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)