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"}
app
とcurrent_user
を経由してapp.session
に到達するために考えられるすべてのことを試しましたが、うまくいきませんでした。どうすればcurrent_user
を取得できますか?
current_user
はコントローラーのプロパティであるため、app.post('/sign_in', ...
の後に、Railsコンソールでapp.controller.current_user
を呼び出してUserオブジェクトを取得できます。
実際にログインしていない可能性があります。覚えておくべきことの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でした。