很久以前我遇到了一个网站(我遗憾地丢失了地址,这是某种报纸网站),它让你可以像使用注册用户一样利用一切。您可以评价,收藏和评论文章,当您这样做时,它会显示一条谨慎的嵌入式消息,说明您必须在网站上注册才能保存您的贡献。然后它有链接让你看看你的个人资料如果你的样子会是什么样子,我很惊讶地看到它在那里有我所有的活动;我阅读和保存的文章,评论等等。我离开了网站,当我以后出于好奇心回到它时,它仍然保存了我的活动。
我认为这是有史以来最伟大的事情,现在我正在构建一个具有社交功能的网站,我也想采取这种方法。但我仍然是一个菜鸟,所以我不知道如何去做。 你会怎么做?
答案 0 :(得分:8)
我会创建一个Profile
模型,该模型是为访问您网站的任何用户自动创建的,并添加第一个收藏,评价第一个项目等。Profile
应该保存到您的数据库中,包括一个适当随机和独特的字符串。此字符串可以作为cookie存储在客户端,稍后将用于检索您的配置文件。它应该是随机的,足够长,以便您不能轻易篡改您的cookie并获取其他匿名用户的个人资料,但这并非完全可以避免(因此请注意,您不要在匿名配置文件中存储敏感数据!)。
用户注册后,您可以将其Profile
与其新User
记录相关联,并删除Cookie和唯一字符串标识符。您现在可以根据他们的User
记录轻松检索他们的个人资料。
Profile
模型可以包含您要存储的任何信息。
如果要区分注册用户和匿名用户,可以创建AnonymousProfile
模型和Profile
模型(每个模型具有不同的属性),并简单地复制来自匿名配置文件的所有数据当有人注册时,用户个人资料。
<强>更新强>
在整个应用程序中,您可以决定仅在用户登录时使用此信息。您可以定义一个抓取当前用户的before_filter
,并且仅当有实际用户登录时才使用配置文件数据:
class ApplicationController < ActionController::Base
before_filter :fetch_user_data
def fetch_user_data
@current_user = ... # Work your magic to get current user
end
private
def current_profile
@current_user and @current_user.profile # Use profile association
end
end
控制器操作中的某个地方:
if current_profile
# Do stuff with current_profile
# Only available to registered users...
end
如果您改变主意并希望匿名配置文件对您的匿名用户生效,您可以稍后更改current_profile
的实施。
答案 1 :(得分:2)
识别用户的唯一方法是使用cookie。您使用的网站可能正在做的是:
首次,用户在“用户”表格中创建一个条目,并将其添加到“来宾”群组中。将标识符cookie保存到用户计算机,以便稍后再查找。
如果用户决定注册,您可以在用户表中填写其余的详细信息(您甚至可能希望有一个单独的表来显示用户详细信息和注册详细信息,如用户名/密码等...)并添加它们注册用户组。
管理组的方式可以像数据库中的标志一样简单。
因为这是一个铁路问题......
我可能会在你的application_controller.rb中的before_filter中处理大部分内容。步骤如下:
if has_cookie
@user = lookup_user
else
@user = create_new_guest_user
end
您可以非常轻松地扩展其中一个现有的身份验证框架,例如acts_as_authenticated或clearance来执行此操作。