2016-09-21 65 views
0

嗨,大家,我在网上到处搜索,似乎无法找到答案,所以在这里。购物车结帐功能没有用户登录

我有一个网站,列出了导师资料。我想要实现的功能是让用户能够对用户进行短名单并拥有“结账”功能。在他们的“购物车”中添加了一些导师之后,他们将继续“结账”。当他们这样做时,他们会被提示输入姓名/电子邮件/电话号码。然后一封电子邮件会发送给我,并附上他们与他们的信息一起入围的导师名单。

我试着研究类似的“购物车”功能,但他们中的大多数似乎有一个用户当前登录。此外,我似乎无法弄清楚如何处理此“结帐”功能,并发送该信息在用户将所有他们想要的导师列入名单之后给我的。

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

+0

http://railscasts.com/episodes/393-guest-user-record – max

+0

@max在我的实例中不起作用。以亚马逊为例。在你去亚马逊的那一刻,你就可以开始购物并将它们添加到购物车中。这是我需要的功能之一,根据我的理解,我将不得不与[session]一起工作。然而,我不知道如何在该会话中存储入围信息,并在用户(未登录的用户)击中提交按钮时通过电子邮件发送给我。 – angkiki

回答

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 

另一种方法是存储在会话中的数据 - 通常,这将需要使用会话存储器中,如分布式缓存以避免浏览器cookie的大小限制。

1

如前所述,您可以使用访客用户或店铺信息session(两种方法实际上都非常相似)。

随着你仍然会保存他的身份证在会议来宾用户(warden会替你),并在数据库的记录(将用于只,而在浏览器的用户会话是打开的)。如果你愿意,你可以使用其他表/模型来达到这个目的,并将它的id存储在你自己的用户会话中。虽然guest user在注册用户和非注册用户都有好处,但您的逻辑将完全相同。你提到,你可以在亚马逊上买东西无需注册,但来宾用户策略也不需要注册,它是你谁决定如何展示给用户(无论是Hello guest user #123或只保留链接Sign In

事情要记住:

  • 可能要“清理”老guest users防止users表 从无休止的增长。
  • 您可能想要添加逻辑'合并'来宾用户信息与现有用户(例如。如果有人忘了登录,摘了一些项目,然后登录)

对于会话存储你需要从CookiesStorage切换容量更大,以水木清华(cookie是4KB最多,对吧?)。选项包括DatabaseStorage,或memcached的,或Redis的,等

事情要记住:

  • 你不会需要做清理
  • 你可能仍然要添加逻辑“合并”
  • guest用户信息与现有的用户(例如,如果有人忘记登录,挑选了一些项目,然后登录)
  • 如果你想处理注册和来宾用户这种方式会导致代码中的许多条件,所以来宾用户将是一个更好的选择
相关问题