如何将能力应用于cancan中的非rest控制器



我是新手,无论如何我都不懂康康舞。

我已经读了这个教程,但是不知道如何把它应用到我的情况中。

在cancan wiki中有:

  • 一个AdminController
  • a roll_logs动作

在能力课上他说:

can :roll, :logs if user.admin?

我不明白:roll和:log符号与控制器和动作有什么关系?

我想做的就是说,如果一个用户是管理员,给他们访问AdminController动作的权限,否则不要,这可能吗?

这是可能的。

声明

can :roll, :logs if user.admmin?

表示当调用authorize! :roll, :logs时,如果用户不是管理员,则抛出未经授权的异常。

所以它与控制器或动作没有任何关系,直到你把它变成这样。

如果你有一个logs_controller,例如一个动作滚动,你可以这样做。

class LogsController < ApplicationController
  def roll
    authorize! :roll, :logs
    # Rest of the roll functionality.
  end

所以在你的例子中,你想给admin权限的用户访问所有的admin控制器动作。

你可以这样做。

ability.rb

class Ability
  include CanCan::Ability
  def initialize(user)
    can(:manage, :admin) if user.admin?
  end
end

admin_controller.rb

class AdminController < ApplicationController
 authorize_resource :class => false
 def foo
 end
 def bar
 end
end

这将确保只有管理员可以访问admin_controller的foo和bar操作。

:class => false语句意味着您没有授权资源,这是我们想要的,因为您没有授权某个帖子或评论。您只是在控制器上授权操作。

最新更新