2011-04-07 88 views
1

讓我們假設一個簡單而常見的場景。如何在Rails的模型中擁有兩個「訪問級別」?

我有一個User模型與admin字段。用戶不能編輯admin字段,但管理員可以編輯任何人的admin字段。

所以,我需要給兩種類型的用戶適當的訪問權限。

如果我提出這個REST方式,我有兩個資源,說

resource :user 
namespace :admin do 
    resources :users 
end 

...這裏來的困境 - 我怎麼控制,其中admin場是可以改變的哪裏不?

  1. 我可以設置attr_protected :admin,以防止用戶更改他們的管理狀態。但後來我不得不做出一個特例,出來的和Admin::UsersController,像

    @user.admin = params[:user][:admin] 
    
  2. 我可以擦洗在UsersController的參數,這是更糟糕的

    params[:user].delete(:admin) 
    

兩個這些解決方案對我來說看起來很混亂。處理這種情況的正確方法是什麼?

如果超過2個訪問級別會怎麼樣?

+0

你試過ACL插件,像色器件或declarative_authorization緩解你的煩惱? – corroded 2011-04-07 16:44:35

+0

好吧,設計只處理驗證,並且declarative_authorization在每個模型級別上工作,而我想要在每個字段級別上進行控制。 – 2011-04-07 16:59:29

回答

2

子類化如何?也許嘗試是這樣的:

class User < ActiveRecord::Base 
    attr_accessible :columns, :that, :are, :safe, :for, :users 
end 

class AdminUser < User 
    attr_accessible :admin 
end 

然後使用適當的模型,每個控制器。注意在User類中使用attr_protected在這種情況下將不起作用,因爲AR沒有(當前)智能地應用它們,它會抱怨:admin只能在一箇中。無論如何,使用attr_accessible通常會更好。

1

考慮重新加工您的資源,看起來像:

users/guest 
users/user 
users/admin 

其中

admin<user 

user<guest 

建立在喬恩的出色答卷,你可以嘗試類似如下:

class Guest < ActiveRecord::Base 
    attr_accessible :columns, :that, :are, :safe, :for, :guests 
    attr_reader :is_admin 
end 

class User < Guest 
    attr_accessible :more, :stuff, :for, :users 
end 

class AdminUser < User 
    attr_accessible :some, :adminThings, :here 
    attr_writer :is_admin 
end 

...然後AdminUser將從Guest繼承attr_read:is_admin。

希望幫助 -

佩裏

相關問題