2009-05-27 50 views
5

很久以前,我遇到了一个网站(我不幸丢了地址,这是某种报纸网站),可以让您像使用注册用户一样利用一切。你可以评价,收藏和评论文章,当你做了它会显示一个谨慎的,嵌入的信息,说你必须注册到网站,以保存你的贡献。然后它有链接让你看到你的个人资料如果你做了,看起来如何,我很惊讶地发现它有我所有的活动;我阅读和保存的文章,评论等。我离开了网站,当我刚刚出于好奇而回到它时,它仍然保存了我的活动。如何在Rails中实现这种渐进式/懒惰注册?

我认为这是有史以来最伟大的事情,现在我正在建立一个具有社交功能的网站,我也想采取这种方法。但我仍然是一个小菜鸟,所以我没有太多的线索知道如何去做。 你会怎么做?

回答

8

我会创造它是自动访问您的网站,并增加了第一喜欢的任何用户,费率的第一个项目,等等。Profile创建应保存到数据库中,包括适当的随机和独特的字符串Profile模型。该字符串可以作为cookie存储在客户端,稍后将用于检索您的配置文件。它应该是随机的和足够长的时间,以便您不能轻易篡改您的cookie并获取其他匿名用户的配置文件,但这不是完全可以避免的(因此请小心,您不要在匿名配置文件中存储敏感数据!)。

用户注册后,您可以将它们的Profile与其新的User记录相关联,并删除co​​okie和唯一字符串标识符。您现在可以根据他们的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实施您改变主意并希望匿名配置文件对匿名用户有效。

+0

谢谢,这听起来不错。但是,如果在用户注册之前没有将活动实际应用到网站上,该怎么办?对不起,如果这是一个愚蠢的问题,但从你的回答来看,这并不明显。 – 2009-05-27 22:11:13

2

识别用户的唯一方法是使用cookie。您正在使用的网站可能是:

用户第一次在“用户”表中创建一个条目,并将它们添加到“宾客”组中。将标识符cookie保存到用户机器中,以便稍后再查找它们。

如果用户决定注册,您可以填写自己的详细信息,其余的在user表(你甚至可能要对用户的详情及报名的细节,如用户名/密码等..一个单独的表),并添加他们到注册用户组。

您管理组可以在数据库中的标志一样简单的方式。

由于这是一个轨道的问题...

我大概会处理这个最在你application_controller.rb一个的before_filter。具体的步骤是这样的:

if has_cookie 
    @user = lookup_user 
else 
    @user = create_new_guest_user 
end 

你可以很容易地扩展像acts_as_authenticated或间隙做到这一点,现有的认证框架之一。

+0

感谢您的回答,这听起来非常有前途。我不是很熟悉restful_authentication,例如,但由于管理组“可以在数据库中的标志一样简单”,我想我可以用它来设置权限,防止客户的活动将被保存,直到它被注册,对?我的意思是,这将是在角色和应用/插件的权限部分做什么,我猜。 – 2009-05-27 22:16:11