2012-04-17 4 views
0

私はシナトラのアプリでこのフィルタを持っている:Rubyのバージョンに応じて配列または文字列としてSplat?

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

言い換えれば、私はちょうどURLのロケールの一部を取得し、それがなかったかのようにアプリのprocedeをさせたいです。 (もちろんレンダリング時にロケールを使用しています)

これはRuby 1.8.7で問題なく動作しますが、スプラットは単なる文字列ではなく1つの項目を持つ配列なので、> = 1.9でブレークします。私はそれを動作させるためにparams[:splat].firstを使用しなければならなかった。

私の質問は、この矛盾がどこから来るのかです。それは単にRuby 1.8対1.9のものですか?またはSinatraは何らかの形で関与していますか?

今後この種のものをより簡単に修正できるようにしたいと考えています。

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

私はここに示します:あなたはどちらの場合に対処するために、このような何かを行うことができるように、文字列や配列のいずれかになります:[スプラット]

答えて

2

シナトラドキュメントは、それはparamsは示しているようだ

$ 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) 
+0

ニース、ありがとう!この違いが最初に現れる理由についての洞察はありますか?もちろん、Sinatra READMEには配列と文字列の両方のスプラットの例があります。 – Felixyz

関連する問題