RubyRuby on RailsRuby、Rails知识

在没有对应模型的控制器上使用cancancan

2017-12-01  本文已影响7人  海内寻知己

原创声明

此博客在简书创作,作者为海内寻知己,转载请注明原文出处和作者,不遵守以上规则禁止转载,请支持原创。

文章内容

此博客是对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方法为资源式路由
)

上一篇下一篇

猜你喜欢

热点阅读