CanCan - 将控制器映射到现有模型

时间:2013-04-06 14:33:15

标签: ruby-on-rails ruby rubygems cancan

我想将“MyController”映射到User模型

#ability
class Ability
  include CanCan::Ability

  def initialize user
    user ||= User.new
    if user.has_role? :admin
      can :manage, :all
    else
      can :read, :all
      can :read, User do |u|
        u && u.user_id == user.id
      end

    end
  end
end

#routes
get 'my_controller/show/(:id)', to: 'MyController#show'

#controller
class MyController < ApplicationController
  # load_and_authorize_resource

  def show
    # showing a user
  end
end

因此,只有my_controller/show/(:id)admin才能访问current user。例如,拥有id == 2的用户可以看到自己的个人资料my_controller/show/2,而my_controller/show/1234则不能看到其他用户的个人资料,除非他们是admin

项目中没有My模型。理想情况下,我必须将MyController重命名为UserController,但出于某种原因我不允许这样做。

如果我在load_and_authorize_resource取消注释MyController,则会出现错误

NameError in MyController#show

uninitialized constant My

那我怎么能摆脱它?

1 个答案:

答案 0 :(得分:2)

您可以指定要加载和授权的资源类型的名称:

load_and_authorize_resource :user

否则cancan将尝试按惯例(基于控制器的名称)进行解决。

https://github.com/ryanb/cancan/wiki/authorizing-controller-actions