web-dev-qa-db-ja.com

Rails 3-IRBコンソールでDeviseのcurrent_userにアクセスするにはどうすればよいですか?

IRBでいくつかの設計/デバッグを行っており、ユーザーにログインしてから、current_userを使用できるようにする必要があります。

Brian Deterlingの answer から別の質問まで、次のシーケンスで正常にログインしてページ応答にアクセスできました。

>> ApplicationController.allow_forgery_protection = false
>> app.post('/sign_in', {"user"=>{"login"=>"some-login-id", "password"=>"some-password"}})
>> app.get '/some_other_path_that_only_works_if_logged_in'
>> pp app.response.body

注:200の応答を受け取った場合は、ログインしていません。ログインが成功したことを示すには、302リダイレクトが必要です。ティムサンテフォードの答えを参照してください。

セッション情報を取得できました:

1.9.3-p125 :009 > app.session
 => {"_csrf_token"=>"1yAn0jI4VWzUH84PNTH0lVhjpY98e9echQGS4=", "session_id"=>"89984667d30d0fec71f2a5cbb9017e24"} 

appcurrent_userを経由してapp.sessionに到達するために考えられるすべてのことを試しましたが、うまくいきませんでした。どうすればcurrent_userを取得できますか?

26
Don Leatham

current_userはコントローラーのプロパティであるため、app.post('/sign_in', ...の後に、Railsコンソールでapp.controller.current_userを呼び出してUserオブジェクトを取得できます。

26
sguha

実際にログインしていない可能性があります。覚えておくべきことの1つは、DeviseIがラックミドルウェアであるWardenの上に構築されていることです。

私が取り組んでいるDeviseを使用するアプリにログインするapp.postメソッドを試しました。ログインページに投稿して302リダイレクトを取得した後、app.session監視員のユーザーIDを表示しました。

>> app.session
{
 "_csrf_token"=>"dT0/BqgLb84bnE+f1g...",
 "warden.user.user.key"=>["User", [42843], "$2a$10$1OU.1BixIba..."],
 "session_id"=>"0dd49c05ff4e6362c207c6eb877f86cd"
}

私は次のようにユーザーを取得することができました:

>> current_user = User.find(app.session["warden.user.user.key"][1][0])

ログアウトしてから不正なパスワードでログインしようとすると、200が表示され、app.sessionに監視ユーザー情報がなく、例のようにcsrfトークンとセッションIDのみが含まれていました。

ところで:ログインしたらapp.controller.current_userは、監視ユーザーIDがセッションに含まれている場合でもnilでした。

4
Tim Santeford