让我们假设一个简单而常见的场景。
我的User
模型带有admin
字段。用户无法修改其admin
字段,但管理员可以修改任何人的admin
字段。
因此,我需要为两种类型的用户提供适当的访问权限。
如果我以RESTful的方式呈现这个,我会有两个资源,比如说
resource :user
namespace :admin do
resources :users
end
......这就是困境 - 如何控制admin
字段可以更改的位置以及不在哪里?
我可以设置attr_protected :admin
以防止用户更改其管理状态。但是,我必须在Admin::UsersController
中提出一个特殊情况,例如
@user.admin = params[:user][:admin]
我可以清除UsersController
中的参数,这更糟糕
params[:user].delete(:admin)
这两种解决方案对我来说都很混乱。处理这种情况的正确方法是什么?
如果访问级别超过2个怎么办?
答案 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/