2011-06-17 22 views
8

現在、私はdevilsでレール3のアプリケーションを持っています。ユーザーはアクセスのために登録/サインインする必要があります。Rails 3 + Deviseでゲストユーザを作成する方法

ゲストユーザを有効にしたいと思います。ユーザーが特定のビューにアクセスすると、そのユーザーのゲストユーザーアカウントが作成され、その後、そのユーザーが認証/登録する場合、そのゲストユーザーは通常のユーザーにアップグレードされます。

チャットルームと考えてください。私はゲストユーザがチャットルームに参加できるようにして、その後、登録するためにツイッターにoauthしてほしい。しかし、私は加入前にユーザーを強制的に登録したくありません。

提案?

私はこれを見つけた:それとhttps://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user

問題は、私はヘルパーを追加ですが、current_or_guest_userを開始する方法を理解していません。また、特定の許可ビューごとにどのように開始するのかもわかりませんか?

アイデア?ポインタ?おかげ

+0

私のApplicationHelperへのリンクにメソッドを追加し、コントローラ 'user = current_or_guest_user'で次のように呼び出すと、エラーが発生します:未定義のローカル変数またはメソッド 'current_or_guest_user 'for – AnApprentice

+0

' include ActionView: :Helpers :: ApplicationHelper 'をコントローラーに追加しましたが、現在は取得できません:未初期化定数ActionView :: Helpers :: ApplicationHelper – AnApprentice

+1

ヘルパーを含めても構わないと思います。特定のエラーメッセージが表示されますか?あなたはペーストビンに入れられますか? – colinross

答えて

14

別のより透明な方法がこれですように擬似コードでそれが何かのようになります。

def current_user 
    super || guest_user 
end 

private 

def guest_user 
User.find(session[:guest_user_id].nil? ? session[:guest_user_id] = create_guest_user.id : session[:guest_user_id]) 
end 

def create_guest_user 
    u = User.create(:name => "guest", :email => "guest_#{Time.now.to_i}#{rand(99)}@example.com") 
    u.save(:validate => false) 
    u 
end 
+0

本当に素敵なアプローチ。私は今も同じことをやっていますが、私は私のユーザモデルに "is_guest"を追加することを選択しましたので、DBとdelteゲストユーザをたどることがあります。 – Automatico

+0

古いゲストユーザを定期的に掃除できるように、 'is_guest'ブール値を追加することをお勧めします。 – Kris

3

はウィキに従った後、ちょうどcurrent_or_guest_user

current_userへの呼び出しを置き換える限りビューが行くように、before_filterを持つコントローラでそれを行います。

はあなたから任意のコードを見ることなく、推測するのは難しいですが、

class ChatController < ApplicationController 
before_filter authenticate_user!, :except => [:join] #this will force users to log in except for the join action 

    def join 
    chat_handle = current_or_guest_user.handle 
    # some more code... 
    end 
+0

ありがとうございました。上記のコメントをご覧ください。 – AnApprentice

2

チェックアウトthis rails castについてゲストユーザー。約5:40頃Deviseについての詳細。