2

對於rails來說很新穎我想從社區獲得關於如何設置受限區域的建議。我剛開始使用Devise,並根據用戶是否登錄瞭解了幾種重定向/渲染視圖的不同方法,我想知道最好的方法是什麼。在軌道中設計限制區域時的最佳做法是什麼?

當前,當我希望登錄的用戶擁有不同的頁面視圖時,我一直在控制器中處理一個未登錄的用戶。例如:

class CollectionsController < ApplicationController 
    before_filter :authenticate_user!, except: [:index, :show] 

    def index 
    @collections = Collection.all 

    if current_user 
     render :admin 
    else 
     render :index 
    end 
    end 
end 

在這種情況下,:admin:index分別對應於views/collections/admin.html.hamlviews/collections/index.html.haml。管理視圖在佈局上與索引視圖相似,但具有編輯,更新,創建等的鏈接。

這是最好的方式嗎?

編輯:我也在考慮嘗試像CanCan這樣的授權寶石,但不知道這是否會過度殺傷。

回答

0

如果您想讓代碼保持良好和乾爽,我建議您查看CanCan - 您目前的做法會導致大量重複的代碼,並可能變得難以管理。 安裝完成後,CanCan將生成一個'能力'文件,您可以在其中定義用戶可以執行或不能執行的操作。在你的情況下,例如,你可能有

def initialize(user) 
    user ||= User.new # guest user (not logged in) 
    if user.admin? 
     can :manage, :all 
    else 
     can :read, :all 
    end 
    end 
在你的意見

然後,你可以做一個簡單的檢查,看看用戶是否具有修改該對象的能力。例如:

<% if can? :create, Project %> 
    <%= link_to "New Project", new_project_path %> 
<% end %> 

這是一個超級有用的寶石和非常有據可查!

+0

我決定和CanCan一起去,太棒了!真的很容易實現和使用。 –

+0

關於這種方法我唯一的問題是,因爲如果有人試圖儘可能地使用MVC,那麼在視圖中擁有這種邏輯是可以理解的嗎? –

0

而不是複製管理和訪客用戶的視圖代碼,並單獨維護他們,你可以只有一個視圖index.html.haml並顯示編輯,更新和創建等的鏈接,只有當current_user不是零或爲此事管理員。

在你看來:

- if current_user 
    = link_to 'Edit', edit_path 
    = link_to 'Update', update_path 

,並在您CollectionController

def index 
    @collections = Collection.all 
end 

這樣你就不需要維護兩個獨立的觀點,你可以擺脫admin.html.haml的。

是的,如果你有很多不同的地方你需要實現這些邏輯,那麼按照@Anchor的建議實現CanCan gem可能就是要走的路。

相關問題