Gem 请问各位有没 cancan 中文详细一些的教程呢?

jesktop · 2012年03月08日 · 最后由 JeskTop 回复于 2012年03月09日 · 5452 次阅读

我在使用 devise 和 cancan 时候,学习 devise 的时候网上看了很多的教程特别在 railscasts 上。可能 devise 比 cancan 容易的原因吧。学习 cancan 的时候就很吃力,感觉好像 github 上的讲的不够清晰,还是我看不明白。在使用过程中,好多错误。 例如,我看其中一个源码,出现下面一堆让我不懂的东西,

def role_symbols
  roles.map(&:to_sym)
end

def roles=(roles)
  self.roles_mask = (roles & ROLES).map { |r| 2**ROLES.index(r) }.sum
end

def roles
  ROLES.reject { |r| ((roles_mask || 0) & 2**ROLES.index(r)).zero? }
end

def role?(role)
  roles.include? role.to_s
end





一开始的时候,我在 user.rb 上,写了 ROLES = %w[admin moderator finance] 然后也 migrate 里, add_column :users, :role, :string

可是后面认真一看,别人怎么出现一个 roles_mask,这就不明白啦,有点混乱了。而且因为我没有提供注册,只是通过rake db:seed设置用户,

admin_user = User.create(:email => "ray@vip.com",
                         :password => "123456",:role => "finance")





可是通过rails dbconsole时候,可是数据库却没有出现

4|ray@vip.com|$2a$10$NNK51QtnvXuKaAQq9cGx0uOusatjLTL30uX/5JHCYeCiXEjSwSSdO||5|2012-03-08 08:09:54.442520|2012-03-08 07:46:39.400685|127.0.0.1|127.0.0.1||




请问在不提供用户注册,只自己录用用户的情况下。怎么设计 cancan 比较好呢? 因为用户数量不多,所以不提供注册。请问谁有写过什么关于 cancan 的文章,或者国外详细的呢? 折腾了一天都没有搞出个究竟,感激不尽~

cancan 的官方 wiki 写的很详细了 关于你说的 roles_mask 这里 http://cn.asciicasts.com/episodes/189-embedded-association 说的很清楚

前段时间做了 devise+cancan 的权限管理,感觉还是很好的 用 devise 做用户管理 用 cancan 做用户权限管理 PS: cancan 的 WIKI 我认为已经相当全面了 Super easy ^.^ 可以给每种用户一个 level 然后通过 level 来控制权限 如果权限比较多的话 --> DSL 存储权限表 少量的话就直接写 Ability.rb 中 假设没有 namespace,已安装好 cancan

# case 权限较少
# current_user 由devise 生成
class Ability
  include CanCan::Ability

  def initialize(current_user)
    return unless current_user
    case current_user.level
    when 0
      can :manage, :all
    when ......
      # 你的权限方案
    else
      # some code
    end
  end
end
=========================================
#case 较多权限
Table: users
id | username | ... | role_level
Table: permissions
id | role_level | user_id | subject_class | action

# model
user.rb
 has_many: permissions
permission.rb
 belongs_to: user

1. 根据用户于权限的关系
# cancan
class Ability
  include CanCan::Ability

  def initialize(current_user)
    return unless current_user
    current_user.permissions.each do |p|
      can p.aciton.to_sym, p.subject_class.constantize
    end
  end
end

2. 根据角色于权限的关系
class Ability
  include CanCan::Ability

  def initialize(current_user)
    return unless current_user
    permissions = Permission.where(:role_level => current_user.role_level).all
    permissions.each do |p|
      can p.aciton.to_sym, p.subject_class.constantize
    end
  end
end


最后别忘了给 controller 上锁哈

cancan 还是很灵活的 我写的肯定不是很好 ,欢迎指正.

permissions = Permission.where(:role_level => current_user.role_level).all 不好意思 这个改过来了, 这行是正确的 Permission.where(:role_level => current_user.role_level) 不是数组 只是一个关系对象 加上 all 才会进行查询 生成一个数组

#1 楼 @vkill 可能因为英语不好,总看的好像懂,好像不懂那样。要学英语先啦。谢谢

#2 楼 @shawnyu 谢谢。我目前就算权限比较少,直接用 level 就可以了吧。因为新手上路,请问那个 level 是直接在 user 里面添加一个 level 就可以了吗?

cancan 是一套框架和辅助方法,实际需要多少权限还是看自己需求的。简单的可能就一个 admin 布尔值,实际中用来做判断的可能是 “群组拥有者?”、“文章允许评论?” 这样的逻辑。mask 这种模式作为参考就行了,不一定要上。

#3 楼 @JeskTop 对的 user 表中加上 level 然后直接在 ability 中写权限就好了

#3 楼 @JeskTop 记得给 level 加上 attr_protected 哦

#6 楼 @ywencn 呵呵 对的对的

#4 楼 @Rei #5 楼 @shawnyu #6 楼 @ywencn 各位老大们,问题解决了~感激不尽啊~

需要 登录 后方可回复, 如果你还没有账号请 注册新账号