Giới thiệu
Rolify là gem trong Rails dùng để hỗ trợ việc quản lý các Roles trong Rails một cách dễ dàng và nhanh chống.
Nó hỗ trợ cả scope trên resource object nào đó.
Ví dụ:
1 2 3 | user<span class="token punctuation">.</span>has_role<span class="token operator">?</span><span class="token punctuation">(</span><span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token variable">@forum</span><span class="token punctuation">)</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">false</span> <span class="token comment"># check user đó có phải là role moderator cho đối tượng forum nào đó không</span> |
Cài đặt
1 2 | gem "rolify" |
=> bundle install
Cách sử dụng
1. Tạo Role Model
Đầu tiên, mình phải sử dụng generator của nó để setup cho Rolify. Model Role và User là tên default. Tuỳ nhiên, bạn cũng có thể dùng tên khác tuỳ thuộc vào project thực tế của bạn.
1 2 | rails g rolify Role User |
The generator will create your Role model, add a migration file, and update your User class with new class methods.
Generator này sẽ:
- tạo model Role
- tạo file migration mới
- cập nhật model User với class method mới
1 2 | rake db:migrate |
2. Configure resource models
Trong những model bạn muốn apply role vào, bạn chỉ cần add method resourcify
như sau:
1 2 3 4 | <span class="token keyword">class</span> <span class="token class-name">Forum</span> <span class="token operator"><</span> <span class="token constant">ActiveRecord</span><span class="token punctuation">:</span><span class="token punctuation">:</span><span class="token constant">Base</span> resourcify <span class="token keyword">end</span> |
Tạo role cho User
Tạo global Role: Role cho tất cả resource object
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:admin</span> |
Tạo role cho một resource instance nào đó:
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>first |
Tạo role cho resource class nào đó:
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span> |
Xoá role:
1 2 3 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>remove_role <span class="token symbol">:moderator</span> |
Role queries
Kiểm tra user đó có global role hay không:
1 2 3 4 5 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">1</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:admin</span> <span class="token comment"># tạo global role</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:admin</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> |
Kiểm tra user đó có role trên resource instance đó hay không:
1 2 3 4 5 6 7 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">2</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>first <span class="token comment"># tạo role cho resource instance</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>first <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>last <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">false</span> |
Kiểm tra user đó có role trên resource class đó hay không:
1 2 3 4 5 6 7 8 9 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">3</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token comment"># tạo role cho resource class</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span> <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>first <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>last <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> |
Nếu bạn tạo global role cho user, gloabl role sẽ overrides toàn bộ các role cho resource:
1 2 3 4 5 6 7 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">4</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:moderator</span> <span class="token comment"># tạo global role</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>first <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>last <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> |
Để kiểm tra user đó có role cụ thể cho resource nào đó hay không:
1 2 3 4 5 6 7 | user <span class="token operator">=</span> <span class="token constant">User</span><span class="token punctuation">.</span><span class="token function">find</span><span class="token punctuation">(</span><span class="token number">5</span><span class="token punctuation">)</span> user<span class="token punctuation">.</span>add_role <span class="token symbol">:moderator</span> <span class="token comment"># tạo a global role</span> user<span class="token punctuation">.</span>has_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>first <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">true</span> user<span class="token punctuation">.</span>has_strict_role<span class="token operator">?</span> <span class="token symbol">:moderator</span><span class="token punctuation">,</span> <span class="token constant">Forum</span><span class="token punctuation">.</span>last <span class="token operator">=</span><span class="token operator">></span> <span class="token keyword">false</span> |
Ở trên là các method cần thiết để sử dụng Roliy, tuỳ nhiên còn có các method khác nữa. Để chi tiết hơn bạn tham khảo tài liệu của nó ở đây.