2012-04-29 10 views
2

Sinatraでredirect_to_nextのクイックヘルパーを作成していましたが、これはsession[:next](存在する場合)またはデフォルトのパスにリダイレクトします。シナトラ、sessionSinatra/Rack session.fetch予期しない結果が発生する

は本当にラックが提供する、とspecによって、fetchためのインタフェースのようなハッシュを提供すると言われています。私は私の問題を説明するために、次のエラーヘルパーを書いた。上記のコードを実行します

error 401 do 
    session[:next] = request.path 
    puts "get #{session[:next]}" 
    puts "fetch #{session.fetch(:next, '/')}" 
    redirect "/login" 
end 

私がログインしていないとき/設定にアクセスしようとすると、I halt 401。これは、私の端子に出力するものです。

get /settings 
fetch/

:nextをキーとして存在しているので、そうでないかのように、なぜそれが私のデフォルトを与えていますか?

更新

この最小限の例と同じ挙動を示します。

require 'sinatra' 

set :sessions, true 

get '/' do 
    session[:testing] = "hello" 
    puts "get #{session[:testing]}" 
    puts "fetch #{session.fetch(:testing, 'goodbye')}" 
end 

ログ

[2012-04-29 14:11:51] INFO WEBrick::HTTPServer#start: pid=1954 port=9292 
get hello 
fetch goodbye 
10.0.2.2 - - [29/Apr/2012 14:11:54] "GET/HTTP/1.1" 200 - 0.0485 

ソフトウェア

  • ルビー(1.9.3p194)
  • ラック(1.4.1)
  • シナトラ(1.3.2)
+0

ここでは問題を再現できません。この動作を表示する最小限の完全な例を提供することは可能ですか? –

答えて

3

セッションハッシュは通常のRuby Hashではなく、Rack::Session::Abstract::SessionHashです。 SessionHashは実際にはHashを継承しますが、overrides the []= and [] methods, calling to_s on any keys before storing and retrieving themです。あなたの更新の例を拡張する

require 'sinatra' 

set :sessions, true 

get '/' do 
    session[:testing] = "hello" 
    puts "get    #{session[:testing]}" 
    puts "fetch    #{session.fetch(:testing, 'goodbye')}" 
    puts "fetch with string #{session.fetch(:testing.to_s, 'goodbye')}" 
end 

は、この出力を与える:

get    hello 
fetch    goodbye 
fetch with string hello 

あなたがHash#fetchを使用し、シンボルを渡して、メソッドがに変換されず、親ハッシュに直接派遣します文字列なので、一致するキーは見つかりません。

したがって、セッションでは常にStringsをキーとして使用してください。すべてがうまくいくはずです。

+0

ありがとうございます。これは私のメインプロジェクトでも働いていました。 –

関連する問題