原创声明
此博客在简书创作,作者为海内寻知己,转载请注明原文出处和作者,不遵守以上规则禁止转载,请支持原创。
文章内容
此博客是对cancancan gem的Github上文档的翻译,原文(英文)链接为 此处。
你可以在没有show/new/edit/destroy等action的controller上使用cancancan,然而,你不应该使用load_and_authorize_resource方法,因为这个controller没有对应的resource(资源)。你应该在这个controller的所有action上分别使用authorize!方法。
小提示:这跟在RESTful式的controller上加非RESTful action是不同的。想了解详细信息就去Authorizing Controller Actions页面的Choosing Actions 部分。
举个例子,假如我们有一个controller,它有一些各种各样的管理tasks,像查看log文件。我们在这里使用authorize!方法。
class AdminController < ActionController::Base
def roll_logs
authorize! :roll, :logs
# roll the logs here
end
end
并且之后在Ability类里添加authorize。
can :roll, :logs if user.admin?
注意你可以传递a symbol来作为第二个参数给上面的authorize!和can。它不必是a model class or instance。通常第一个argument是执行的动作,第二个是操作对象(被之前action操作的操作对象)。它可以是任何东西(译者注:“东西”在这里指单词)。
另一种方式:authorize_resource
另一种方式你可以使用authorize_resource并且设置它为no class。这种方式可以替换传递的资源符号。这是一个好的方式处理有一个好像有资源的controller,实质上没有对应的资源的controller。
class ToolsController < ApplicationController
authorize_resource :class => false
def show
# automatically calls authorize!(:show, :tool)
end
end
(译者注:
1、这里文档说明(示例代码注释里的说明)比较粗糙,该注释提示你在Ability类里添加authorize,像这样:
can :show, :tool if @user.admin?
(你自己定义的判断)
2、这里不要在routes.rb文件里配置该controller的show方法为资源式路由
)