2012-03-20 39 views
1

我懷疑這是比代碼更好的最佳實踐問題。如果我有一個站點(RoR3和Devise),註冊用戶可以使用正常的視圖集合將文檔上載並創建到數據庫中。當然,用戶必須先註冊並登錄網站。他們創建了一個文件後,可能會發送一個鏈接給另一個沒有在該網站註冊的人(而且不會)。混合安全用戶和訪問者在同一網站

所以我設想是一組視圖是「只讀」如果你在邀請的人可以查看文檔,但無法瀏覽該視圖外,除了主頁。設計似乎沒有一個未登錄的訪問者的概念,我可以看到,我還沒有找到任何人這樣做。

謝謝

回答

0

呀,這可能很麻煩,尤其是在非註冊用戶可以做一些東西,但不是全部。我們嘗試了幾種方法來解決我最近工作過的公司中的這個問題,包括您提到的邀請方面。

因爲我們的整個應用都是圍繞着用戶,當用戶訪問該網站,我們創建的用戶的一個實例。如果用戶已登錄,則用戶模型將由數據庫記錄支持,如果不是,則它們只是一個虛擬用戶,我們使用會話數據來存儲半持久狀態信息。

在application_controller我們設置current_user要麼真正的用戶或只是一個對象,所以它總是可用的,並且嘎嘎如用戶,尤其是包括registered?方法

起初,我們裹着噸的東西在我們的看法與if current_user.registered?到處都是。但那很快就會變得一團糟。更好的模式(在差異顯着的情況下)將創建類似於_sidebar_sidebar_registered的部分,所以我們可以創建一個方法,根據用戶狀態給定部分的根名稱。

在邀請,如果他們被邀請,用戶只能獲得有限的內容的情況下,我們寫的,是由一個模型支持的邀請模塊。邀請者可以從系統發送電子郵件,或者生成帶有嵌入式令牌的URL。我們將令牌存儲在一個表中,以便我們知道誰邀請了誰,這在我們的案例中是必要的 - 查找令牌就是驗證所需的全部內容。一旦用戶進行了分類驗證,我們就將該狀態存儲在會話中,並且用戶(invited?)上的方法會讓我們知道用戶是否有權訪問。

一般有隻有註冊用戶可以得到在特定的整個控制器的動作(例如編輯/刪除),我們只是將使用before_filters控制器來控制訪問。這主要是因爲事情變得混亂。

我們確實看康康舞,我們開始變得不同級別的用戶授權。但我可以告訴你,除非你仔細隔離誰可以看到並做什麼,否則這可能會迅速變得粗糙。

+0

好方法。你有沒有玩過使用子域或名稱範圍? – 2012-03-20 21:56:50

+0

子域名會混淆搜索引擎優化 - 在我們的案例中,未註冊的訪問者看到的頁面與註冊用戶具有基本相同的內容,因此需要使用相同的URL。命名範圍......並非如此:最終,在任何用戶來到的第一頁被看到之前,做出了一個簡單的決定並將其存儲起來;在我們的案例中,這只是一個註冊用戶看到多少信息和什麼樣的問題。 – 2012-03-20 23:52:35

+0

好點我沒有想過SEO。接縫再次像簡單的作品:)謝謝 – 2012-03-21 13:35:10

0

Devise爲您提供了user_signed_in?方法和current_user方法來幫助你處理這種事情。例如,在你看來,你可以沿着線的東西:

<% if user_signed_in? %> 
    <%= current_user.username %> 
<% end %> 

如果您的權限變得更加複雜,我會建議使用授權寶石幫助您管理限制的部分。幾個例子是Declarative Authorzation(我個人最喜歡的)和CanCan