Skip to content

Instantly share code, notes, and snippets.

@3dd13
Last active June 22, 2022 09:16
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save 3dd13/7718287 to your computer and use it in GitHub Desktop.
Save 3dd13/7718287 to your computer and use it in GitHub Desktop.
some helper methods for handling guest user in Rails (with devise) ecommerce website
#
# User Stories:
# To start shopping easily,
# guest user wants to add items to shopping cart without signing up
#
#
# Code Explanation:
# - a guest_user is created when new user arrives to your website, so that he could have his own shopping cart, and adding items to shopping cart.
# - when the guest_user sign up, all items in the shopping cart should be transferred to the new signed up user account
#
module GuestUser
extend ActiveSupport::Concern
def current_or_guest_user
if current_user
if session[:guest_user_id]
transfer_guest_user_records_to_logged_in_user
guest_user.destroy
session[:guest_user_id] = nil
end
current_user
else
guest_user
end
end
def guest_user
@cached_guest_user ||= User.find(session[:guest_user_id] ||= create_guest_user.id)
rescue ActiveRecord::RecordNotFound # if session[:guest_user_id] invalid
session[:guest_user_id] = nil
guest_user
end
private
def transfer_guest_user_records_to_logged_in_user
if current_user.shopping_cart
guest_user_shopping_cart = guest_user.shopping_cart
guest_user_shopping_cart.shopping_cart_items.each do |shopping_cart_item|
shopping_cart_item.shopping_cart_id = current_user.shopping_cart.id
shopping_cart_item.save!
end
guest_user_shopping_cart.destroy
else
shopping_cart = guest_user.shopping_cart
shopping_cart.user_id = current_user.id
shopping_cart.save!
end
if guest_user.favourites.any?
guest_user.favourites.each do |favourite|
favourite.user_id = current_user.id
favourite.save!
end
end
end
def create_guest_user
u = User.new(:email => "guest_#{Time.now.to_i}#{rand(99)}@example.com")
u.skip_confirmation!
u.save!(:validate => false)
session[:guest_user_id] = u.id
u
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment