ide*_*der 18 ruby ruby-on-rails devise ruby-on-rails-3
我正在使用Rails 3和Devise进行用户身份验证.假设我有一个User模型,启用了Devise,还有一个Product模型,以及一个User has_many Products.
在我的Products控制器中,我希望我的find方法由current_user限定,即.
@product = current_user.products.find(params[:id])
除非用户是管理员用户,即current_user.admin?
现在,我几乎在所有方法中运行该代码,这看起来很混乱:
if current_user.admin?
@product = Product.find(params[:id])
else
@product = current_user.products.find(params[:id])
end
Run Code Online (Sandbox Code Playgroud)
这样做有更优雅/标准的方式吗?
nat*_*vda 22
我喜欢这样做:
class Product
scope :by_user, lambda { |user|
where(:owner_id => user.id) unless user.admin?
}
end
Run Code Online (Sandbox Code Playgroud)
这允许您在控制器中编写以下内容:
Product.by_user(current_user).find(params[:id])
Run Code Online (Sandbox Code Playgroud)
如果你在很多控制器中运行这个代码,你应该把它变成一个过滤器,并在你的ApplicationController中定义一个方法:
before_filter :set_product, :except => [:destroy, :index]
def set_product
@product = current_user.admin? ? Product.find(params[:id]) : current_user.products.find(params[:id])
end
Run Code Online (Sandbox Code Playgroud)
我不知道你用什么来确定用户是否是管理员(角色),但是如果你看看CanCan,它有一个accessible_by范围接受一种能力(控制用户可以做什么和不能做什么的对象)并根据您自己编写的权限返回用户有权访问的记录.这可能真的是你想要的,但是剥离你的权限系统并替换它对你来说可能是可行的,也可能是不可行的.
| 归档时间: |
|
| 查看次数: |
14136 次 |
| 最近记录: |