如何在Rails中的模型上有两个“访问级别”?

时间:2011-04-07 16:13:00

标签: ruby-on-rails ruby ruby-on-rails-3 rest activerecord

让我们假设一个简单而常见的场景。

我的User模型带有admin字段。用户无法修改其admin字段,但管理员可以修改任何人的admin字段。

因此,我需要为两种类型的用户提供适当的访问权限。

如果我以RESTful的方式呈现这个,我会有两个资源,比如说

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)
    
  3. 这两种解决方案对我来说都很混乱。处理这种情况的正确方法是什么?

    如果访问级别超过2个怎么办?

3 个答案:

答案 0 :(得分: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 :(得分:1)

考虑将资源重新设计为:

users/guest
users/user
users/admin

,其中

admin<user 

user<guest

在Jon的优秀答案的基础上,您可以尝试以下内容:

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。

希望有所帮助 -

佩里

答案 2 :(得分:0)

看起来Rails 3.1将完全符合我的要求。

http://ablogaboutcode.com/2011/05/12/activerecord-3-1-mass-assignment-roles/