在Rails3应用程序中,我有许多带有user_id的模型 - 我这样说:它是由某个用户创建的。
像:
current_user.id #=> 1
@item.user_id #=> 1
# this item created by user with id 1
我想限制current_user访问不是他/她创建的项目。
类似的东西:
if @item.user_id == current_user.id
#everything is fine
else
#redirect somwhere with flash "You don't have an access here"
end
最好的方法是什么,因为我有多个模型(以及显示/编辑/销毁的控制器)和这样的user_id?
答案 0 :(得分:4)
使用CanCan!
有了它,您将能够以声明方式定义权限,如下所示:
can :read, Project, :user_id => user.id
后来执行这条规则:
def show
@project = Project.find(params[:id])
authorize! :read, @project
end
authorize!
会引发异常,但您可以更加和平地办理登机手续:
<%= link_to 'Link to a project', @project if can? :read, @project %>
您可以拦截授权错误并在一个地方处理它们:
class ApplicationController < ActionController::Base
rescue_from CanCan::AccessDenied do |exception|
redirect_to root_url, :alert => exception.message
end
end
答案 1 :(得分:0)
最简单的方法是使用Active Record的has_many
。
即,在控制器中,只要您加载Item
,就可以说
@item = current_user.items.find(params[:id])
通过这种方式,您无需进行任何检查工作。