2011-09-11 38 views
0

我之前使用过CanCan,它很棒,但有时我不需要这种可定制的角色管理。有时我只需要区分管理员和其他人。所以,我通常只为我需要保护的控制器和方法写一个:authenticate_admin!方法。Rails中的非插件角色管理

我发现有点复杂的是确保用户只能管理自己拥有的资源。说,我用户可以创建posts,我不希望他们能够更新或销毁他们没有创建的帖子。所以,我很好奇其他人如何以最干的方式处理这个问题。

这就是我所做的,把我的头顶部:

在应用控制器:

def user_can?(resource_user_id, current_user_id) 
    return true if current_user.is_admin 
    return true if resource_user_id == current_user_id 
end 

然后,在有问题的控制器,我像做

before_filter :can_manage_project?, :except => [:new, :create] 

protected 
    def can_manage_project? 
    @project = Project.find(params[:id]) 
    return true if user_can?(@project.user_id, current_user.id) 
    redirect_to user_path(current_user), :flash => {:error => "Sorry, you're not allowed to do that."} 
    end 

对于一个相对简单的任务似乎有很多代码。你怎么处理这个任务?我相信有一个更优雅的解决方案 - 使用宝石或插件。

回答

1

我的第一个想法是抽象出一点点,并通过一个acts_as_user_manageable类型的装饰物将is_manageable?方法混合到模型中。资源控制器会得到一个manageable_by_current_user?过滤器(我不知道我怎么会自动做到这一点)。 is_manageable?可以封装任意的规则,所以它将能够处理像管理标志等东西。

我必须玩一下看看我最喜欢什么实现,但像这样的解决方案似乎很合理,可能是很多人会为不需要标准解决方案所提供的控制级别的项目挖掘的东西。

+0

(回想起来,我不确定我应该发布这个答案,因为它对实现细节很重要)。 –

+0

没关系......我还在寻找更多关于实现的理论。 – Slick23

+0

* Whew *;)这是我现在要在这个周末玩的东西,因为我需要类似的东西(虽然更加细化),而且cantango离开了我......不紧张。 –