2011-07-10 9 views
6

auth_logicを使用して「ログインするにはあなたの名前をクリックする」システムを構築しようとしています。私のユーザモデルには電子メールと名前欄があります。ログインするには、私は単純に実行します。作成されたセッションにはなりません。残念ながら#<UserSession:{:unauthorized_record => "<protected>"}>

UserSession.create(@user, true) 

#<UserSession: {:unauthorized_record=>"<protected>"}> 

私のユーザモデルがちょうど1行があります:

acts_as_authentic 

ユーザーセッションラインは、私がどこかで見つけたこれを、持っている。私はこのメッセージが見つかったデバッガを使用して私はそれが何をするかわからないと私はとせずに試してみた:

class UserSession < Authlogic::Session::Base 
    def to_key 
    new_record? ? nil : [ self.send(self.class.primary_key) ] 
    end 
end 

データベース(そのuser_sessionsテーブルが必要な場合、私もよく分からない):私は「

create_table "sessions", :force => true do |t| 
    t.string "session_id", :null => false 
    t.text  "data" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

add_index "sessions", ["session_id"], :name => "index_sessions_on_session_id" 
add_index "sessions", ["updated_at"], :name => "index_sessions_on_updated_at" 

create_table "user_sessions", :force => true do |t| 
    t.datetime "created_at" 
    t.datetime "updated_at" 
end 

create_table "users", :force => true do |t| 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "persistence_token" 
    t.string "email" 
    t.string "name" 
end 

メートルのRails 3.0.9を使用して、私のGemfileが(私は通常とのGitHub authlogic宝石の両方試してみました)と言う:

gem 'rails', '3.0.9' 
gem 'sqlite3' 
gem "authlogic" #, :git => 'git://github.com/odorcicd/authlogic.git', :branch => 'rails3' 

Hereのソースコードの残りの部分。

私は数日前に同様のプロジェクトでこの問題を抱えていました。私はちょっと覚えていない。

アイデア?これは私にナッツを駆動しています...

+0

こんにちはSjorsのようなコードに期待を置くところ、私は同じ問題を抱えています。あなたはこの問題の解決策を見つけましたか? – Dorian

+0

Twitterのログインだけが必要な場合は、この宝石は簡単です:https://github.com/mislav/twitter-login –

+0

同様の問題があります。どんな解決策ですか? –

答えて

2

可能な解決策...それらのヘルパーメソッドの例の2つのバージョンが浮かんでいるように見えます。さどうやら

@current_user = current_user_session && current_user_session.record 

、.user(または任意のログインフィールドがある):我々が使用しoneあり:

@current_user = current_user_session && current_user_session.user 

をして、いくつかの新しいチュートリアルと例であるthe newer versionありセッションオブジェクト上で呼び出された場合、unauthorized_recordを返しますが、.record.userは適切なデータを返します。

+0

おかげさまで、twitter-login gemを使用していましたので、私はあなたのソリューションをテストできません。私はそれが誰かに助けになるだろうと確信しています。 –

1

最近この問題が発生し、混乱しました。私は私のコードの特定の問題を解明したので、これは別の潜在的な解決策です。

TL; DR

私は#<UserSession: {:unauthorized_record=>"<protected>"}>はまだ我々は自分自身を作成し​​ただけでunauthedつの有効なユーザーセッションであることを理解していませんでした。これを確認するにはuserを呼び出し、UserのインスタンスをUserSession.createに渡す必要があります。

原因

実際の問題は2倍です。 current_userメソッドは、現在のユーザーが要求の存続期間中にが変更されないという前提で構築されました。私は既に1つを作成する前にcurrent_userを呼び出していました。次のように簡略化することができます。

def current_user 
    return @current_user if defined?(@current_user) 

    @current_user = some_method_that_finds_a_proper_user 
end 

ここで重要なのは、ユーザーを見つけるための私の方式はnilを返すことができるということです。その場合、@current_usernilと定義されます。したがって、キャッシュされた値は後続の呼び出しで常に返されます。それは本当にあなたのコードが必要なものに依存して、それが少し難しくなるのはここ

ソリューション

です。

  1. あなたは、あなたが何かをする必要がありますが、レンダリングまたはリダイレクトを待たないUserSession.createとにおけるユーザモデルに署名した後current_userを必要としない場合。次のリクエストで、current_userが正しく設定されます。

  2. あなたは、すでにログインしているユーザーを確認することができた場合UserSession.createcurrent_userへの呼び出しを削除し、期待通りcurrent_userにあなたの最初の呼び出しが動作する必要がない場合。

  3. current_usernil秒をキャッシュ、またはインスタンス変数が定義されている場合は、値がtruthyの代わりであるかどうかを判断するために、これらのキャッシュされた値のため、ガードを変更しない、キャッシュを使用しないのいずれかを生成し、あなたの方法のチェーンを確認してください。ガードに変更することができます

    return @current_user if [email protected]_user.nil? # or @current_user.present? in Rails 
    

    それともRubyの||=オペレータと暗黙のリターンを使用することができます。上記の私の簡単な例ではなく、次のようになります。

    def current_user 
        @current_user ||= some_method_that_finds_a_proper_user 
    end 
    

    をするか、のように単純ではない場合

    def current_user 
        @current_user ||= begin 
        some_code 
        doing_many 
        things_here 
        end 
    end 
    
  4. それとも、あなたの問題は、この動作のためのテストを書くのトラブルを抱えていることが考えられます。その場合、私はむしろちょうど

    expect(UserSession).to receive(:create).with(user) 
    
関連する問題