0

Sinatraアプリにこのフィルターがあります:

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

つまり、URLのロケール部分を取得して、そこにないかのようにアプリを続行させたいのです。(もちろん、ビューをレンダリングするときにロケールを使用します。)

これはRuby1.8.7では正常に機能しますが、スプラットが単なる文字列ではなく1つの項目を持つ配列であるため、>=1.9で機能しなくなります。私はparams[:splat].firstそれを機能させるために使用しなければなりませんでした。

私の質問は、この不一致がどこから来ているのかということです。それは単にRuby1.8対1.9のものですか?それともシナトラはどういうわけか関与していますか?

将来的には、このようなことをもっと簡単に修正できるようにしたいと思っています。

4

1 に答える 1

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)
于 2012-04-17T22:50:29.527 に答える