2009-05-27 52 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