2016-09-21 66 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用戶信息與現有的用戶(例如,如果有人忘記登錄,挑選了一些項目,然後登錄)
  • 如果你想處理註冊和來賓用戶這種方式會導致代碼中的許多條件,所以來賓用戶將是一個更好的選擇
相關問題