大家好,我通过网络到处搜索,似乎无法找到答案,所以这里就是这样。
我有一个列有Tutor Profiles的网站。我想要实现的功能是允许用户能够将用户列入候选名单并进行"结账"功能。在他们的"购物车"中添加了一些导师之后,他们将进入"结帐"。当他们这样做时,将提示他们输入他们的姓名/电子邮件/电话号码。然后会向我发送一封电子邮件,其中包含他们已经入围的导师列表以及他们的信息。
我尝试过研究类似的购物车"功能,但大多数似乎有一个用户当前登录。而且我似乎无法弄清楚如何处理这个" Checkout"功能,并在用户将所有他们想要的导师入围后将信息发送给我。
所有解决方案和帮助将不胜感激!非常感谢你!
答案 0 :(得分:1)
如前所述,您可以在session
中使用访客用户或商店信息(两种方法实际上非常相似)。
使用访客用户,您仍会将其ID存储在会话中(warden
为您执行此操作)和DB中的记录(仅在浏览器中的用户会话打开时使用) )。如果需要,您可以使用其他表/模型来实现此目的,并将其自己的ID存储在用户会话中。虽然guest user
在注册用户和非注册用户都有好处,但您的逻辑将完全相同。您已经提到过您可以在没有注册的情况下在亚马逊购物,但来宾用户策略也不需要注册,而且您是谁决定如何向用户显示(无论是Hello guest user #123
还是仅保留链接Sign In
)
要记住的事情:
guest users
以阻止users
表
从无尽的成长。对于会话存储,您需要从容量更大的CookiesStorage
切换到smth(Cookie最多为4KB,对吧?)。选项包括DatabaseStorage,memcached或redis等
要记住的事情:
答案 1 :(得分:0)
一种策略是在用户首次访问网站时创建访客用户记录。
以下是使用Warden的基本示例。
class User < ActiveRecord::Base
has_secure_password, validations: false
enum status: [:guest, :registered] # ...
validates :email, presence: true, unless: :guest?
validates :password, presence: true, confirmation: true, unless: :guest?
end
class ApplicationController < ActionController::Base
helper_method :signed_in?, :current_user
prepend_before_action :authenticate!
before_action :create_guest_user!, unless: :signed_in?
def create_guest_user!
warden.set_user( User.create!(status: :guest) )
end
def signed_in?
!current_user.nil?
end
def current_user
request.env['warden'].user
end
def authenticate!
warden.authenticate!
end
end
然后,当用户完成结帐时,您会更新users.status
列,以表明他们是真正的用户。
当然,这将创建一堆可能永远不会被使用的客人记录,这些记录可能需要通过rake任务来清理。
namespace :users do
desc "Cleans out guest records"
task :cull => :environment do
User.guest.where('created_at > ?' 1.month.ago).destroy_all
end
end
另一种方法是将数据存储在会话中 - 通常这需要使用会话存储(例如memcached)来避免浏览器cookie大小限制。