cancan 筆記

Cancan 筆記

簡介

cancan 是一套 Rails 的權限設定 Gem ,最常見用的地方就是我們需要針對使用者或者管理者進行權限控管的時候我們可以針對該 user 的 role 來判定它能夠有什麼樣的權限。

以往常見的做法是:

Helper:

def editable?(user)
  if user.has_role? :admin
    link_to("編輯", edit) + link_to("刪除", destroy)
  elsif user.has_role? :member
    link_to("編輯", edit)
  else
    ""
  end
end

View:

<%= editable?(user) %>

但是用了 cancan 之後我們可以用

Ability.rb

def intialize(user)
  
  if user.blank?
    basic
  elsif user.has_role? :admin
    admin_only
  elsif user.has_role? :member
    members_only
  else
    basic
  end
end

def basic
  can :read, [ Post, Comment ]
end

def members_only
  can [ :create, :update ], [ Post, Comment ]
end

def admin_only
  can :manage, :all
end

如此一來,我們就可以在 view 裡面這樣做

<% if can? :create, Post %>
  <%= link_to("新增", new_post_path) %>
<% end %>

<% if can? :manage, Post %>
  <%= link_to("文章管理", admin_posts_path) %>
<% end %>

這主要是 cancan 可以用的情境。

Before we start

我想,各位可以先去閱讀 xdite 寫的三篇 cancan 介紹文章:

  1. Cancan 實作角色權限設計的最佳實踐(1)
  2. Cancan 實作角色權限設計的最佳實踐(2)
  3. Cancan 實作角色權限設計的最佳實踐(2)

看完之後其實你就會用 cancan 了 … XD

但是我在看完之後其實還是有點一知半解,在 Custom Action 的時候不知道該怎樣設定自訂的 action ,所以我讀了一下文件後知道了一件事:讀官方文件很重要啊!!!

自訂 Action

廢話不多說,假設我們想要做一個 like 的動作,我們可以這樣做:

can :like, Post

然後在前端這樣寫:

<%= link_to_if(can?(:like, Post), "Like (Y)", like_post_path(post)) %>

其實就只是這樣而已 …

現在正在研究 nested resources 的部分。

Comments

comments powered by Disqus