2016-08-21 10 views
3

私はトラブル次のような状況をundestanding持っている:私は、ログインして、次のルビー[:remember_token]とクッキー[「remember_token」]

class SessionsController < ApplicationController 

    def create 
    user=User.find_by(email: params[:session][:email]) 
    if user && user.authenticate(params[:session][:password]) 
     log_in(user) 
     params[:session][:remember_me]=="1" ? remember(user) : forget(user) 
     redirect_to user 
    else 
     flash.now[:danger]="Invalid email/password combination" 
     render "new" 
    end 
    end 
を行うことで、私のユーザーを覚えています

および

module SessionsHelper 

    def remember(user) 
     user.remember 
     cookies.permanent.signed[:user_id]=user.id 
     cookies.permanent[:remember_token]=user.remember_token 
    end 

これらのすべてが問題なく機能します。 [:remember_token]それリターンない理由

test "login with remember_me" do 
    log_in_as(@user) 
    assert_not_nil cookies["remember_token"] 
end 

nilを返します。私も理解していない事は、私はクッキーを使用する必要が統合テスト[「remember_token」]で、次のような状況のクッキーであるためということですセッションヘルパーの中の関数(例えば、user.authenticated?(クッキー[:remember_token]))のパラメータとして使用すると、なぜそれはできませんか?

PS:すべての上のコードは、Michael HartlのRuby on Railsチュートリアルから来ていますhttps://www.railstutorial.org/book(チャプター9.3.1)

答えて

4

これは、通常のアプリケーションでは、は、常にクッキー名を文字列に変換するActionDispatch::Cookies::CookieJarオブジェクトを返します。統合テストでは、cookiesメソッドは、変換を行わないRack::Test::CookieJarオブジェクトを返します。だから、シンボルを使ってテストであなたのクッキーを設定する場合は、シンボルを介してそれにアクセスする必要があります。文字列でクッキーを設定しても同じことが起こります。

+0

なぜHashWithIndifferentAccessがCookieJarクラスのクッキーを内部的に表現するのに使われていないのか?私はソースが '@cookies [name.to_s]'のところにあるのを見つけました。 – jaydel

+0

私は多くの理由が考えられます。このクラスはかなり重く、HWIAとしても機能するネストされたハッシュを許可します。これはクッキーに共通することではありません。多分オブジェクトの割り当てのようなパフォーマンスの理由もあります。 –

+0

ええ。私はActiveSupportのバージョンを見て、クラスが実際に何を提供しているのか考えてみると、実装はかなり複雑です。 – jaydel

0

ルビーのすべてのオブジェクトです。
ハッシュテーブルにオブジェクトがある場合:remember_tokenをキーにして、remember_tokenの2つの異なるオブジェクトにキーを要求しています。

関連する問題