rails 使用cancancan的一些心得

来源:互联网 发布:linux enca 编辑:程序博客网 时间:2024/06/05 08:01

1. 都知道cancancan对于权限管理而言是一个利器。能满足绝大多数的应用场景。
安装也很方便

gem 'cancancan', '~> 1.10'

然后 bundle

  1.  之后可以构造cancancan的相应文件了
rails g cancan:ability

这样就会在你的models下创建ability.rb文件。(app/models/ability.rb
同时得确认在你的

app/controllers/application_controller.rb

下存在对于ablity对象的创建

def current_ability  @current_ability ||= Ability.new(current_user)end

Ok,这样就可以在ability.rb里去定义一些权限操作了。
这些很简单,按照wiki上的来定义就可以了。
如下:

can :manage, Order, :order_type => "some"

类似于这些,这里主要是说下在controller中加入权限的一些问题。
在controller中使用

load_and_authorize_resource

会出现一些情况,例如:

ActiveModel::ForbiddenAttributesError

我们知道,这个是因为参数的问题,白名单。可是在加入之前是好好的,加入了权限的操作之后就出现了。经过查找,是因为params的名字引起的。需要改变为:

def #{model.underscore}_params #Order => order  params.require(:model).permit({   :name,   :address   })end

这样就可以规避出现的这个问题。

另外一个就是controller的命名与model的命名不符合。

uninitialized constant ControllerNameClass

可以换种加载权限的方式

load_and_authorize_resource => authorize_resource :class => Model

可以发现,这样是可以指定权限的class,就可以规避这种情况。

值得注意的一点是,权限管理的模块过多,全部放在ability下面会显得很臃肿。
我们可以mixin到ability.rb

#lib/permissions/some_manage.rbmodule Permissions  module SomeManage    def method      #do somthing    end  endend#app/models/ability.rbclass Ability  include CanCan::Ability  include Permissions::SomeManage  def initialize(user)    user ||= StoreStaff.new # guest user (not logged in)    if user.admin.present?      can :manage, :all    else      do_somthing    end  end  def do_somthing    method  end end

这是碰到的一些小问题,希望可以帮助大家。

1 0
原创粉丝点击