act_as_permission_controllable 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b4379261968ca8f86b6ca67b33cf64c035320386
4
+ data.tar.gz: 40b729251abe3516f8d70d3e2873d6ff38785296
5
+ SHA512:
6
+ metadata.gz: 02e1a461c3171a6701efbdd49a4eca78e8808b1da050c8f2d2ca2d823f28f13dd9d3da041f0381a0312fffd87e32ce0b1b7443afc7e12c592c033351d51ea846
7
+ data.tar.gz: 39dead1069325510c18ab99d1439ee91d5b52fdd3a05e9c0b5aa84a2a94c8483829f5a9ba7b0512674b4c2d559201769d7b74ec15f8d83688ad4249db04bc80c
@@ -0,0 +1,20 @@
1
+ Copyright 2017 Cai Guanhao (Choi Goon-ho)
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,212 @@
1
+ # ActAsPermissionControllable
2
+
3
+ *Control user / admin permissions with cancancan.*
4
+
5
+ Easily integrate cancancan into your application with permission control of every controller action.
6
+
7
+ ![aapc](https://user-images.githubusercontent.com/1284703/29483144-bd8abd5a-84d2-11e7-99de-3741b727621c.png)
8
+
9
+ ## Installation
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'act_as_permission_controllable'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ ```bash
19
+ $ bundle
20
+ ```
21
+
22
+ Or install it yourself as:
23
+
24
+ ```bash
25
+ $ gem install act_as_permission_controllable
26
+ ```
27
+
28
+ ## Migration
29
+ Add a `permissions` JSONB field to your model:
30
+
31
+ ```bash
32
+ rails g migration AddPermissionsToAdmins permissions:jsonb
33
+ ```
34
+
35
+ Add `default: {}, nil: false`:
36
+
37
+ ```ruby
38
+ class AddPermissionsToAdmins < ActiveRecord::Migration[5.1]
39
+ def change
40
+ add_column :admins, :permissions, :jsonb, default: {}, nil: false
41
+ end
42
+ end
43
+ ```
44
+
45
+ ## Model
46
+ Add `act_as_permission_controllable` to your model:
47
+
48
+ ```ruby
49
+ class Admin < ApplicationRecord
50
+ act_as_permission_controllable # methods added: ban, permit, assign_permissions, can?
51
+ end
52
+ ```
53
+
54
+ Create `app/models/ability.rb`:
55
+ ```ruby
56
+ class Ability
57
+ include ActAsPermissionControllable::Ability
58
+ end
59
+ ```
60
+
61
+ ## Controller
62
+ Add `grant_permission` to your base controller.
63
+ Controllers inherited from it will need authorization.
64
+ You can rescue from `CanCan::AccessDenied` error to show permission error message.
65
+ You also need to define `current_ability` for `cancancan` to work.
66
+ ```ruby
67
+ class Admin::BaseController < ApplicationController
68
+
69
+ # ... other code ...
70
+
71
+ grant_permission
72
+
73
+ rescue_from CanCan::AccessDenied do |exception|
74
+ respond_to do |format|
75
+ format.json {
76
+ render json: { message: exception.message }, status: 403
77
+ }
78
+ format.html {
79
+ render 'act_as_permission_controllable/forbidden', layout: 'admin', status: 403, locals: { exception: exception }
80
+ }
81
+ end
82
+ end
83
+
84
+ private
85
+
86
+ def current_ability
87
+ @current_ability ||= Ability.new(current_admin)
88
+ end
89
+
90
+ # ... other code ...
91
+ end
92
+ ```
93
+
94
+ If you don't want a controller to check user permission, use `skip_grant_permission`.
95
+ ```ruby
96
+ class Admin::HomeController < Admin::BaseController
97
+ skip_grant_permission
98
+ end
99
+ ```
100
+
101
+ If your controller has different index page:
102
+ ```ruby
103
+ class Admin::AdminsController < Admin::BaseController
104
+ grant_permission index: :welcome
105
+
106
+ def welcome
107
+ end
108
+ end
109
+ ```
110
+
111
+ To edit permissions on the web page, add actions to your routes:
112
+ ```ruby
113
+ resources :admins do
114
+ member do
115
+ match :permissions, via: [ :get, :post ]
116
+ end
117
+ end
118
+ ```
119
+
120
+ And in your controller:
121
+ ```ruby
122
+ class Admin::AdminsController < Admin::BaseController
123
+ # ... other code ...
124
+
125
+ def permissions
126
+ if request.post?
127
+ @admin.assign_permissions(params.fetch(:actions, []))
128
+ if @admin.save
129
+ flash[:notice] = 'OK!'
130
+ else
131
+ flash[:error] = 'ERROR!'
132
+ end
133
+ redirect_to params[:referer].presence || permissions_admin_admin_path(@admin)
134
+ return
135
+ end
136
+
137
+ render 'act_as_permission_controllable/permissions'
138
+ end
139
+
140
+ # ... other code ...
141
+ end
142
+ ```
143
+
144
+ ## View
145
+ You can use `controllable_nav_items` to list permitted pages for current user:
146
+ ```erb
147
+ <ul class="nav navbar-nav">
148
+ <% controllable_nav_items do |item| %>
149
+ <%= content_tag :li, class: (name = item.controller_name) == controller.controller_name ? 'active' : nil do %>
150
+ <%= link_to item.i18n_name, (url_for(controller: name, action: item.index) rescue nil) %>
151
+ <% end %>
152
+ <% end %>
153
+ </ul>
154
+ ```
155
+
156
+ ## I18n
157
+ You can customize the names of each controller action and the order of each controller:
158
+ ```yaml
159
+ # config/locales/aapc.en.yml
160
+ en:
161
+ act_as_permission_controllable:
162
+ order:
163
+ - Admin::OrdersController
164
+ - Admin::SettingsController
165
+ - Admin::AdminsController
166
+ controllers:
167
+ Admin::AdminsController: 'Admins'
168
+ Admin::OrdersController: 'Orders'
169
+ Admin::SettingsController: 'Settings'
170
+ actions:
171
+ Admin::AdminsController:
172
+ permissions: 'View and Set Permissions'
173
+ Admin::OrdersController:
174
+ export: 'Export Orders'
175
+ ```
176
+
177
+ ## Methods
178
+ ### `ban(subject, *actions)` and `permit(subject, *actions)`
179
+ ```ruby
180
+ # permit multiple actions of a controller
181
+ Admin.find(1).permit(:user, :create, :update, :destroy).save
182
+
183
+ # permit all actions in user controller
184
+ Admin.find(1).permit(:user, :all).save
185
+
186
+ # ban all except some permissions
187
+ Admin.find(1).ban(:all).permit(:settings, :update).save
188
+
189
+ # permit all except some permissions
190
+ Admin.find(1).permit(:all).ban(:admin, :permissions).save
191
+
192
+ # you can use controller class name as subject
193
+ Admin.find(1).ban(:all).permit('Admin::SettingsController', :update).save
194
+ ```
195
+
196
+ ### `can?(action, subject)`
197
+ ```ruby
198
+ if current_admin.can?(:destroy, :user)
199
+ # admin can destroy user
200
+ end
201
+ ```
202
+
203
+ ## Example
204
+ You can run the app in `test/dummy` directory and visit `http://admin.localhost.com:3000`.
205
+
206
+ ## Contributing
207
+
208
+ You can open issues or pull requests on [GitHub](https://github.com/caiguanhao/act_as_permission_controllable).
209
+
210
+ ## License
211
+
212
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -0,0 +1,33 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ rescue LoadError
4
+ puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
5
+ end
6
+
7
+ require 'rdoc/task'
8
+
9
+ RDoc::Task.new(:rdoc) do |rdoc|
10
+ rdoc.rdoc_dir = 'rdoc'
11
+ rdoc.title = 'ActAsPermissionControllable'
12
+ rdoc.options << '--line-numbers'
13
+ rdoc.rdoc_files.include('README.md')
14
+ rdoc.rdoc_files.include('lib/**/*.rb')
15
+ end
16
+
17
+
18
+
19
+
20
+
21
+
22
+ require 'bundler/gem_tasks'
23
+
24
+ require 'rake/testtask'
25
+
26
+ Rake::TestTask.new(:test) do |t|
27
+ t.libs << 'test'
28
+ t.pattern = 'test/**/*_test.rb'
29
+ t.verbose = false
30
+ end
31
+
32
+
33
+ task default: :test
@@ -0,0 +1,13 @@
1
+ <h1 class="text-danger"><sub class="glyphicon glyphicon-exclamation-sign"></sub> <%= t('act_as_permission_controllable.views.forbidden') %></h1>
2
+
3
+ <h4><%= t('act_as_permission_controllable.views.forbidden_page') %></h4>
4
+
5
+ <% if can?(:permissions, :admin) %>
6
+ <hr>
7
+ <div class="pull-right">
8
+ <small><code><%= "Admin.find(#{current_admin.id}).permit!(:#{exception.subject}, :#{exception.action})" %></code></small>
9
+ </div>
10
+ <div>
11
+ <%= link_to t('act_as_permission_controllable.views.edit_permissions'), permissions_admin_admin_path(current_admin), class: 'btn btn-default' %>
12
+ </div>
13
+ <% end %>
@@ -0,0 +1,84 @@
1
+ <% can_update = can? :permissions, :admin %>
2
+
3
+ <%= form_tag permissions_admin_admin_path(@admin), method: :post do %>
4
+ <%= hidden_field_tag :referer, request.headers['Referer'] %>
5
+ <table class="table table-permissions" id="table-permissions">
6
+ <thead>
7
+ <tr>
8
+ <td colspan="5">
9
+ <%= submit_tag t('act_as_permission_controllable.views.update_permissions'),
10
+ class: 'btn btn-default pull-right', disabled: !can_update %>
11
+ <h4>
12
+ <%= t('act_as_permission_controllable.views.update_permissions') %>
13
+ <%= "(#{@admin.permission_count}/#{Admin.total_permission_count})" %>
14
+ <small>
15
+ <a class="toggle-checkboxes" href data-target="table-permissions">toggle</a>
16
+ </small>
17
+ </h4>
18
+ </td>
19
+ </tr>
20
+ </thead>
21
+ <tbody>
22
+ <% controllable_controllers.each_slice(5) do |slice| %>
23
+ <tr>
24
+ <% slice.each do |controller| %>
25
+ <td width="20%">
26
+ <strong>
27
+ <%= controller.i18n_name %>
28
+ </strong>
29
+ <small>
30
+ <a class="toggle-checkboxes" href data-target="checkboxes-<%= @cb = @cb.to_i + 1 %>">toggle</a>
31
+ </small>
32
+ <div class="checkboxes" id="checkboxes-<%= @cb %>">
33
+ <% controller.actions.each do |action| %>
34
+ <div class="checkbox">
35
+ <label>
36
+ <%= check_box_tag "actions[#{action.controller.to_s}][]", action,
37
+ action.permitted_in?(@admin.permissions), id: nil, disabled: !can_update %>
38
+ <%= action.i18n_name %>
39
+ </label>
40
+ </div>
41
+ <% end %>
42
+ </div>
43
+ </td>
44
+ <% end %>
45
+ </tr>
46
+ <% end %>
47
+ </tbody>
48
+ <tfoot>
49
+ <tr>
50
+ <td class="active" colspan="5">
51
+ <%= submit_tag t('act_as_permission_controllable.views.update_permissions'),
52
+ class: 'btn btn-default', disabled: !can_update %>
53
+ </td>
54
+ </tr>
55
+ </tfoot>
56
+ </table>
57
+ <% end %>
58
+
59
+ <script>
60
+ (function () {
61
+ document.addEventListener('click', function (e) {
62
+ if (/\btoggle-checkboxes\b/.test(e.target.className)) {
63
+ e.preventDefault();
64
+ var target = e.target.dataset.target;
65
+ if (!target) return;
66
+ var targetElement = document.getElementById(target);
67
+ if (!targetElement) return;
68
+ var cbs = targetElement.querySelectorAll('input[type="checkbox"]');
69
+ var i;
70
+ var length = cbs.length;
71
+ var allChecked = true;
72
+ for (i = 0; i < length; i++) {
73
+ if (!cbs[i].checked) {
74
+ allChecked = false;
75
+ break;
76
+ }
77
+ }
78
+ for (i = 0; i < length; i++) {
79
+ cbs[i].checked = !allChecked;
80
+ }
81
+ }
82
+ }, false);
83
+ })();
84
+ </script>
@@ -0,0 +1,15 @@
1
+ en:
2
+ act_as_permission_controllable:
3
+ views:
4
+ forbidden: Forbidden
5
+ forbidden_page: Sorry, you're not allowed to visit the page you requested.
6
+ edit_permissions: Edit Permissions
7
+ update_permissions: Update Permissions
8
+ actions:
9
+ new: 'New %{model}'
10
+ create: 'Create New %{model}'
11
+ index: '%{model} List'
12
+ show: '%{model} Details'
13
+ edit: 'Edit %{model}'
14
+ update: 'Update %{model}'
15
+ destroy: 'Delete %{model}'
@@ -0,0 +1,15 @@
1
+ zh_CN:
2
+ act_as_permission_controllable:
3
+ views:
4
+ forbidden: 禁止访问
5
+ forbidden_page: 抱歉,管理员不允许你访问特定页面。
6
+ edit_permissions: 修改权限设置
7
+ update_permissions: 更新权限设置
8
+ actions:
9
+ new: '新建%{model}'
10
+ create: '创建%{model}'
11
+ index: '%{model}列表'
12
+ show: '%{model}详细页'
13
+ edit: '编辑%{model}'
14
+ update: '更改%{model}'
15
+ destroy: '删除%{model}'
@@ -0,0 +1,8 @@
1
+ require 'act_as_permission_controllable/act'
2
+ require 'act_as_permission_controllable/ability'
3
+ require 'act_as_permission_controllable/action'
4
+ require 'act_as_permission_controllable/controller'
5
+ require 'act_as_permission_controllable/helper'
6
+ require 'act_as_permission_controllable/i18n'
7
+ require 'act_as_permission_controllable/railtie'
8
+ require 'cancancan'
@@ -0,0 +1,18 @@
1
+ module ActAsPermissionControllable
2
+ module Ability
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ include CanCan::Ability
7
+
8
+ def initialize(user)
9
+ return if !user || !(Hash === user.permissions)
10
+ user.permissions.each do |controller_name, actions|
11
+ controller = controller_name.safe_constantize
12
+ next if controller.nil?
13
+ can actions.map(&:to_sym), controller.controller_name.singularize.to_sym
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,34 @@
1
+ require 'act_as_permission_controllable/model'
2
+
3
+ module ActAsPermissionControllable
4
+ module Act
5
+ module Model
6
+ extend ActiveSupport::Concern
7
+
8
+ module ClassMethods
9
+ def act_as_permission_controllable
10
+ include ActAsPermissionControllable::Model
11
+ end
12
+ end
13
+ end
14
+
15
+ module Controller
16
+ extend ActiveSupport::Concern
17
+
18
+ module ClassMethods
19
+ def grant_permission(options = {})
20
+ ActAsPermissionControllable::Controller.set(self, options.slice(:index))
21
+
22
+ def self.inherited(subclass)
23
+ ActAsPermissionControllable::Controller.set(subclass, {})
24
+ super
25
+ end
26
+ end
27
+
28
+ def skip_grant_permission
29
+ ActAsPermissionControllable::Controller.remove(self)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,35 @@
1
+ module ActAsPermissionControllable
2
+ class Action
3
+ def self.actions_for_controller(controller)
4
+ controller.public_instance_methods(include_super = false).map { |action| self.new(action, controller) }
5
+ end
6
+
7
+ def initialize(action, controller)
8
+ @action = action
9
+ @controller = controller
10
+ end
11
+
12
+ def to_s
13
+ @action.to_s
14
+ end
15
+
16
+ def controller
17
+ @controller
18
+ end
19
+
20
+ def permitted_in?(permission_hash)
21
+ actions = permission_hash[controller.to_s]
22
+ (Array === actions) && actions.map(&:to_s).include?(to_s)
23
+ end
24
+
25
+ def i18n_name
26
+ model = Controller.new(controller).i18n_name
27
+ defaults = [
28
+ :"act_as_permission_controllable.actions.#{to_s}",
29
+ to_s.titleize,
30
+ ]
31
+ I18n.translate(:"act_as_permission_controllable.actions.#{controller.to_s}.#{to_s}",
32
+ model: model, default: defaults)
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,90 @@
1
+ module ActAsPermissionControllable
2
+ class Controller
3
+ mattr_accessor :permission_controllable_controllers do
4
+ Hash.new
5
+ end
6
+
7
+ mattr_accessor :preload_controller do
8
+ -> {
9
+ if ::Rails.application.config.cache_classes != true
10
+ ::Dir["#{::Rails.root}/app/controllers/**/*_controller.rb"].each do |file|
11
+ require file
12
+ end
13
+ end
14
+ }
15
+ end
16
+
17
+ def self.set(controller, options)
18
+ if !self.permission_controllable_controllers[controller.to_s]
19
+ controller.authorize_resource(class: false) # cancancan
20
+ end
21
+ self.permission_controllable_controllers[controller.to_s] = options
22
+ end
23
+
24
+ def self.remove(controller)
25
+ if self.permission_controllable_controllers[controller.to_s]
26
+ self.permission_controllable_controllers.delete(controller.to_s)
27
+ controller.skip_authorize_resource # cancancan
28
+ end
29
+ end
30
+
31
+ def self.get_controllers(sorted: false)
32
+ self.preload_controller.call if Proc === self.preload_controller
33
+
34
+ controllers = self.permission_controllable_controllers.map { |controller, _|
35
+ self.new(controller)
36
+ }.select(&:controllable?)
37
+
38
+ if sorted
39
+ order = I18n.t('act_as_permission_controllable.order', default: [[]])
40
+ controllers = controllers.sort_by(&:controller_name).sort_by.with_index { |controller, i|
41
+ [ order.index(controller.to_s) || order.size, i ]
42
+ }
43
+ end
44
+
45
+ controllers
46
+ end
47
+
48
+ def initialize(controller)
49
+ @controller = case controller
50
+ when Symbol then controller.to_s.safe_constantize
51
+ when String then controller.safe_constantize
52
+ else controller
53
+ end
54
+ @data = self.class.permission_controllable_controllers[@controller.to_s]
55
+ end
56
+
57
+ def nil?
58
+ @controller.nil?
59
+ end
60
+
61
+ def controllable?
62
+ !!@data && actions.present?
63
+ end
64
+
65
+ def controller_name
66
+ @controller.controller_name
67
+ end
68
+
69
+ def to_s
70
+ @controller.to_s
71
+ end
72
+
73
+ def i18n_name
74
+ name = controller_name.singularize
75
+ defaults = [
76
+ :"activerecord.models.#{name}",
77
+ name.camelize,
78
+ ]
79
+ I18n.translate(:"act_as_permission_controllable.controllers.#{to_s}", default: defaults)
80
+ end
81
+
82
+ def actions
83
+ Action.actions_for_controller(@controller)
84
+ end
85
+
86
+ def index
87
+ @data[:index].presence || :index
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,15 @@
1
+ module ActAsPermissionControllable
2
+ module Helper
3
+ def controllable_nav_items(user = current_admin, &block)
4
+ @_controllable_nav_items ||= controllable_controllers.select do |controller|
5
+ actions = user.permissions[controller.to_s]
6
+ actions && actions.map(&:to_s).include?(controller.index.to_s)
7
+ end
8
+ block_given? ? @_controllable_nav_items.each(&block) : @_controllable_nav_items
9
+ end
10
+
11
+ def controllable_controllers
12
+ @_controllable_controllers ||= Controller.get_controllers(sorted: true)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1 @@
1
+ I18n.load_path += ::Dir[File.expand_path('../../../config/locales/*.yml', __FILE__)]
@@ -0,0 +1,93 @@
1
+ module ActAsPermissionControllable
2
+ module Model
3
+ extend ActiveSupport::Concern
4
+
5
+ included do
6
+ def ban(subject, *actions)
7
+ control_permissions :ban, subject, *actions
8
+ self
9
+ end
10
+
11
+ def permit(subject, *actions)
12
+ control_permissions :permit, subject, *actions
13
+ self
14
+ end
15
+
16
+ def assign_permissions(attributes)
17
+ return if !attributes.respond_to?(:each)
18
+ perms, controllers = {}, Controller.get_controllers.map { |c| [ c.to_s, c ] }.to_h
19
+ attributes.each do |name, actions|
20
+ next if !(Array === actions)
21
+ next if (controller = controllers[name.to_s]).nil?
22
+ perms[name.to_s] = controller.actions.map(&:to_s) & actions.map(&:to_s)
23
+ end
24
+ self.permissions = perms
25
+ end
26
+
27
+ def self.total_permission_count
28
+ Controller.get_controllers.sum { |controller| controller.actions.size }
29
+ end
30
+
31
+ def permission_count
32
+ c = 0
33
+ Controller.get_controllers.each do |controller|
34
+ if actions = self.permissions[controller.to_s]
35
+ c += (controller.actions.map(&:to_s) & actions.map(&:to_s)).size
36
+ end
37
+ end
38
+ c
39
+ end
40
+
41
+ def can?(*args)
42
+ @current_ability ||= ::Ability.new(self)
43
+ @current_ability.can?(*args)
44
+ end
45
+
46
+ after_commit do
47
+ @current_ability = nil
48
+ end
49
+
50
+ private
51
+
52
+ def control_permissions(type, subject, *actions)
53
+ type = type.to_s
54
+
55
+ if subject == :all
56
+ Controller.get_controllers.each do |controller|
57
+ if type == 'permit'
58
+ self.permissions[controller.to_s] = controller.actions.map(&:to_s)
59
+ elsif type == 'ban'
60
+ self.permissions.delete(controller.to_s)
61
+ end
62
+ end
63
+ return
64
+ end
65
+
66
+ subject = subject.to_s
67
+ controller = Controller.get_controllers.find do |controller|
68
+ name, key = controller.controller_name, controller.to_s
69
+ subject == key || subject == name || subject == name.singularize
70
+ end
71
+
72
+ return if controller.nil?
73
+
74
+ key = controller.to_s
75
+ self.permissions[key] ||= []
76
+ if actions == [ :all ]
77
+ actions = controller.actions.map(&:to_s)
78
+ else
79
+ actions = actions.flatten.map(&:to_s)
80
+ end
81
+ if type == 'permit'
82
+ self.permissions[key] += actions
83
+ elsif type == 'ban'
84
+ self.permissions[key] -= actions
85
+ end
86
+ self.permissions[key].uniq!
87
+ self.permissions.delete(key) if self.permissions[key].empty?
88
+
89
+ return
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,18 @@
1
+ module ActAsImportable
2
+ class Railtie < ::Rails::Railtie
3
+ initializer "act_as_permission_controllable.active_record" do |app|
4
+ ActiveSupport.on_load :active_record do
5
+ ActiveRecord::Base.send :include, ActAsPermissionControllable::Act::Model
6
+ end
7
+
8
+ ActiveSupport.on_load :action_controller do
9
+ ActionController::Base.send :include, ActAsPermissionControllable::Act::Controller
10
+ ActionController::Base.append_view_path File.expand_path('../../../app/views', __FILE__)
11
+ end
12
+
13
+ ActiveSupport.on_load :action_view do
14
+ ActionView::Base.send :include, ActAsPermissionControllable::Helper
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,3 @@
1
+ module ActAsPermissionControllable
2
+ VERSION = '0.1.0'
3
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :act_as_permission_controllable do
3
+ # # Task goes here
4
+ # end
metadata ADDED
@@ -0,0 +1,111 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: act_as_permission_controllable
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Cai Guanhao (Choi Goon-ho)
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-08-19 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '5.0'
20
+ - - ">="
21
+ - !ruby/object:Gem::Version
22
+ version: 5.0.0
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - "~>"
28
+ - !ruby/object:Gem::Version
29
+ version: '5.0'
30
+ - - ">="
31
+ - !ruby/object:Gem::Version
32
+ version: 5.0.0
33
+ - !ruby/object:Gem::Dependency
34
+ name: cancancan
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.10'
40
+ type: :runtime
41
+ prerelease: false
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.10'
47
+ - !ruby/object:Gem::Dependency
48
+ name: pg
49
+ requirement: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: 0.21.0
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: 0.21.0
61
+ description: Easily integrate cancancan into your application with permission control
62
+ of every controller action.
63
+ email:
64
+ - caiguanhao@gmail.com
65
+ executables: []
66
+ extensions: []
67
+ extra_rdoc_files: []
68
+ files:
69
+ - MIT-LICENSE
70
+ - README.md
71
+ - Rakefile
72
+ - app/views/act_as_permission_controllable/forbidden.html.erb
73
+ - app/views/act_as_permission_controllable/permissions.html.erb
74
+ - config/locales/en.yml
75
+ - config/locales/zh_CN.yml
76
+ - lib/act_as_permission_controllable.rb
77
+ - lib/act_as_permission_controllable/ability.rb
78
+ - lib/act_as_permission_controllable/act.rb
79
+ - lib/act_as_permission_controllable/action.rb
80
+ - lib/act_as_permission_controllable/controller.rb
81
+ - lib/act_as_permission_controllable/helper.rb
82
+ - lib/act_as_permission_controllable/i18n.rb
83
+ - lib/act_as_permission_controllable/model.rb
84
+ - lib/act_as_permission_controllable/railtie.rb
85
+ - lib/act_as_permission_controllable/version.rb
86
+ - lib/tasks/act_as_permission_controllable_tasks.rake
87
+ homepage: https://github.com/caiguanhao/act_as_permission_controllable
88
+ licenses:
89
+ - MIT
90
+ metadata: {}
91
+ post_install_message:
92
+ rdoc_options: []
93
+ require_paths:
94
+ - lib
95
+ required_ruby_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ required_rubygems_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ requirements: []
106
+ rubyforge_project:
107
+ rubygems_version: 2.5.2
108
+ signing_key:
109
+ specification_version: 4
110
+ summary: Control user / admin permissions with cancancan.
111
+ test_files: []