漸進的なエンゲージメント、Deviseとの永続的なゲストユーザ

私は、人々が登録せずに使用できるユーティリティアプリで段階的な関与を設定しようとしています。私はnotepad.ccとjsfiddle.netと私は彼がアプリに '書く'ときにユーザーのためのゲストユーザー(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
8
私は魔法のために魔法使いを捨てており、Railscastはすばらしいです!
追加された 著者 Aen Tan,

2 答え

若干のヤク剃りの後、私はそれをうまく動かすことができた。ここに作業コードがあります:

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

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

15
追加された

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

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

4
追加された
私の答えを投票する心?
追加された 著者 Aen Tan,