2011-11-25 15 views
8

Sto tentando di impostare un impegno graduale nella mia app di utilità che le persone possono utilizzare senza registrarsi, ad es. notepad.cc e jsfiddle.net e ho intenzione di creare un utente ospite (con Devise) per l'utente quando "scrive" sull'app.Coinvolgimento graduale, utente ospite persistente con Devise

Ho trovato questa guida sul wiki di Devise https://github.com/plataformatec/devise/wiki/How-To:-Create-a-guest-user che mostra come creare un utente ospite per la durata della sessione del browser. Quello che voglio è che l'utente continui a utilizzare lo stesso account ospite nelle visite successive, fino a quando non si registra, magari quando introduco piani di abbonamento per più funzionalità.

Come posso modificare cosa c'è nella guida per rendere ciò possibile?

codice nella guida linkato sopra:

# 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 

e di utilizzarlo nel controller:

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

Controlla http://railscasts.com/episodes/393-guest-user-record?view=comments –

+0

Sto scavalcando Devise for Sorcery e Railscast è fantastico! –

risposta

15

Dopo un po 'di yak da barba sono riuscito a farlo funzionare. Ecco il codice di lavoro:

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 

Accetterò un'altra risposta se riesci a mostrarmi un modo migliore per farlo.

4

La soluzione di cui sopra funziona alla grande.

Non dimenticare di impostare helper_method :current_or_guest_user per rendere il metodo accessibile nelle visualizzazioni. Mi ci è voluto un po 'di tempo per capire.

+1

Mente vota la mia risposta? –

Problemi correlati