2011-11-25 14 views
8

私は、ユーザーが登録せずに使用できるユーティリティーアプリで徐々にエンゲージメントを設定しようとしています。私はnotepad.ccとjsfiddle.netと私は彼がアプリに '書く'ときにユーザーのためのゲストユーザー(Deviseと)を作成する予定です。漸進的なエンゲージメント、Deviseの永続的ゲストユーザー

私はこのガイドをDevise wiki https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-userで見つけました。これは、ブラウザセッション中にゲストユーザを作成する方法を示しています。私が望むのは、その後の訪問で同じゲストアカウントを使用し続けることです。サインアップするまで、さらに多くの機能のサブスクリプションプランを導入することができます。

これを可能にするために、ガイドの内容を変更するにはどうすればよいですか?

上記のリンクガイドのコード:

# file: app/controllers/application_controller.rb 

class ApplicationController < ActionController::Base 

    protect_from_forgery 

    # if user is logged in, return current_user, else return guest_user 
    def current_or_guest_user 
    if current_user 
     if session[:guest_user_id] 
     logging_in 
     guest_user.destroy 
     session[:guest_user_id] = nil 
     end 
     current_user 
    else 
     guest_user 
    end 
    end 

    # find guest_user object associated with the current session, 
    # creating one as needed 
    def guest_user 
    User.find(session[:guest_user_id].nil? ? session[:guest_user_id] = create_guest_user.id : session[:guest_user_id]) 
    end 

    # called (once) when the user logs in, insert any code your application needs 
    # to hand off from guest_user to current_user. 
    def logging_in 
    end 

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

end 

とコントローラで使用する:いくつかのヤクシェービング後

@thing.user = current_or_guest_user 
@thing.save 
+0

をチェックしてくださいhttp://railscasts.com/episodes/393-guest-user-record?view=comments –

+0

私は魔法のための魔法使いを捨てており、Railscastはすごいです! –

答えて

15

は、私はそれが仕事を得ることができました。ここでは、作業コードは次のとおりです。

class ApplicationController < ActionController::Base 

    protect_from_forgery 

    # if user is logged in, return current_user, else return guest_user 
    def current_or_guest_user 
    if current_user 
     if cookies[:uuid] 
     logging_in # Look at this method to see how handing over works 
     guest_user.destroy # Stuff have been handed over. Guest isn't needed anymore. 
     cookies.delete :uuid # The cookie is also irrelevant now 
     end 
     current_user 
    else 
     guest_user 
    end 
    end 

    # find guest_user object associated with the current session, 
    # creating one as needed 
    def guest_user 
     User.find_by_lazy_id(cookies[:uuid].nil? ? create_guest_user.lazy_id : cookies[:uuid]) 
    end 

    # called (once) when the user logs in, insert any code your application needs 
    # to hand off from guest_user to current_user. 
    def logging_in 
     # What should be done here is take all that belongs to user with lazy_id matching current_user's uuid cookie... then associate them with current_user 
    end 

    private 

    def create_guest_user 
     uuid = rand(36**64).to_s(36) 
     temp_email = "guest_#{uuid}@email_address.com" 
     u = User.create(:email => temp_email, :lazy_id => uuid) 
     u.save(:validate => false) 
     cookies[:uuid] = { :value => uuid, :path => '/', :expires => 5.years.from_now } 
     u 
     end 

end 

あなたが私にこれを行うには良い方法を示すことができる場合、私は別の答えを受け入れます。

4

上記の解決策は素晴らしいです。

helper_method :current_or_guest_userを設定して、ビューにアクセスできるようにすることを忘れないでください。把握するのに少し時間をかけました。

+1

私の答えを投票する心は? –

関連する問題