一种策略是在用户第一次访问该网站时创建访客用户记录。
这是一个使用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的大小限制。
来源
2016-09-21 18:55:06
max
http://railscasts.com/episodes/393-guest-user-record – max
@max在我的实例中不起作用。以亚马逊为例。在你去亚马逊的那一刻,你就可以开始购物并将它们添加到购物车中。这是我需要的功能之一,根据我的理解,我将不得不与[session]一起工作。然而,我不知道如何在该会话中存储入围信息,并在用户(未登录的用户)击中提交按钮时通过电子邮件发送给我。 – angkiki