没有用户登录的购物车结账功能

时间:2016-09-21 16:58:09

标签: ruby-on-rails

大家好,我通过网络到处搜索,似乎无法找到答案,所以这里就是这样。

我有一个列有Tutor Profiles的网站。我想要实现的功能是允许用户能够将用户列入候选名单并进行"结账"功能。在他们的"购物车"中添加了一些导师之后,他们将进入"结帐"。当他们这样做时,将提示他们输入他们的姓名/电子邮件/电话号码。然后会向我发送一封电子邮件,其中包含他们已经入围的导师列表以及他们的信息。

我尝试过研究类似的购物车"功能,但大多数似乎有一个用户当前登录。而且我似乎无法弄清楚如何处理这个" Checkout"功能,并在用户将所有他们想要的导师入围后将信息发送给我。

所有解决方案和帮助将不胜感激!非常感谢你!

2 个答案:

答案 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大小限制。