skinny_controllers 0.9.1 → 0.10.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3b575298d306f70673c3492426f7cbd3392224f6
4
- data.tar.gz: 357abe13b4b4904ea205a9d85d7c9b840b7a3937
3
+ metadata.gz: 6cba81691573f9ad4648dcacb2733234c5ef4cd5
4
+ data.tar.gz: cb4d9ff187f35d0cd097da6675ed3de9f74115db
5
5
  SHA512:
6
- metadata.gz: ea1b346a06c1ae864099ae64b701342d2f1ae5446611121772f997a7e385bab6805270f242656c608cf7dc38b30f66ff398f35111fc8516aa2ea5c275de44a00
7
- data.tar.gz: bd92722968b07d001a70482ea035a4f490534b8cbe253164daea53c8afb10a6258a641f460d6400f573d493ae73ca50fcc8a7112153fb8162ed6a5f362c81ab3
6
+ metadata.gz: 64f11e00970ccbca44700ff970e54cb92a3b0e5d107b80949d03c6f2bf98deca88774f0a39c71b2b6fd3b2b4dceeae34adccba483deef8f55a7c82a2e799ea76
7
+ data.tar.gz: 6a96956ac79c335072e0755388bb86bd40df665454e57781553090011caa90bbf36ba51a79d1a040dd2cb15d6a59f0f11d8a7448e3f4ec405c29c3d18d7a1d6f
data/README.md CHANGED
@@ -34,12 +34,14 @@ gem 'skinny_controllers'
34
34
  ```
35
35
  or
36
36
 
37
- `gem install skinny_controllers`
37
+ ```bash
38
+ gem install skinny_controllers
39
+ ```
38
40
 
39
41
 
40
42
  ## Generators
41
43
 
42
- ```
44
+ ```bash
43
45
  rails g operation event_summary
44
46
  # => create app/operations/event_summary_operations.rb
45
47
 
@@ -65,18 +67,24 @@ and that's it!
65
67
 
66
68
  The above does a multitude of assumptions to make sure that you can type the least amount code possible.
67
69
 
68
- 1. Your controller name is based off your model name (configurable per controller)
70
+ 1. Your controller name is the name of your _resource_.
69
71
  2. Any defined policies or operations follow the formats (though they don't have to exist):
70
- - `class #{Model.name}Policy`
71
- - `module #{Model.name}Operations`
72
+ - `class #{resource_name}Policy`
73
+ - `module #{resource_name}Operations`
72
74
  3. Your model responds to `find`, and `where`
73
- 4. Your model responds to `is_accessible_to?`. This can be changed at `SkinnyControllers.accessible_to_method`
74
- 5. If relying on the default / implicit operations for create and update, the params key for your model's changes much be formatted as `{ Model.name.underscore => { attributes }}``
75
- 6. If using strong parameters, SkinnyControllers will look for `{action}_{model}_params` then `{model}_params` and then `params`. See the `strong_parameters_spec.rb` test to see an example.
75
+ 4. If relying on the default / implicit operations for create and update, the params key for your model's changes much be formatted as `{ Model.name.underscore => { attributes }}`
76
+ 5. If using strong parameters, SkinnyControllers will look for `{action}_{model}_params` then `{model}_params` and then `params`. See the `strong_parameters_spec.rb` test to see an example.
76
77
 
78
+ ### Per Controller Configuration
77
79
 
80
+ ```ruby
81
+ skinny_controllers_config model_class: AClass,
82
+ parent_class: ParentClass,
83
+ asociation_name: :association_aclasses,
84
+ model_params_key: :aclass
85
+ ```
78
86
 
79
- ### Your model name might be different from your resource name
87
+ #### model_class
80
88
  Lets say you have a JSON API resource that you'd like to render that has some additional/subset of data.
81
89
  Maybe the model is an `Event`, and the resource an `EventSummary` (which could do some aggregation of `Event` data).
82
90
 
@@ -90,7 +98,8 @@ In `EventSummariesController`, you would make the following additions:
90
98
  ```ruby
91
99
  class EventSummariesController < ApiController # or whatever your superclass is
92
100
  include SkinnyControllers::Diet
93
- self.model_class = Event
101
+
102
+ skinny_controllers_config model_class: Event
94
103
 
95
104
  def index
96
105
  render json: model, each_serializer: EventSummariesSerializer
@@ -101,8 +110,17 @@ class EventSummariesController < ApiController # or whatever your superclass is
101
110
  end
102
111
  end
103
112
  ```
113
+
104
114
  Note that `each_serializer` and `serializer` is not part of `SkinnyControllers`, and is part of [ActiveModel::Serializers](https://github.com/rails-api/active_model_serializers).
105
115
 
116
+ Also note that setting `model_class` may be required if your model is namespaced.
117
+
118
+ #### parent_class
119
+
120
+ #### association_name
121
+
122
+ #### model_params_key
123
+
106
124
 
107
125
  ### What if your model is namespaced?
108
126
 
@@ -142,13 +160,13 @@ end
142
160
 
143
161
  The parameters for directly calling an operation are as follows:
144
162
 
145
- | # | Parameter | Default when directly calling an operation | Implicit default via `model` | Purpose |
163
+ | # | Parameter | Default when directly calling an operation | Implicit default | Purpose |
146
164
  |---|-------------------|--------------------------------------------|------------------------------|------------------------------------------|
147
165
  | 0 | current_user | n/a | `current_user` | the user performing the action |
148
166
  | 1 | controller_params | n/a | `params` | the full params hash from the controller |
149
167
  | 2 | params_for_action | `controller_params` | `create_params`, `index_params`, etc | e.g.: requiring a foreign key when looking up index |
150
168
  | 3 | action | `controller_params[:action]` | `action_name` | the name of the current action |
151
- | 4 | model_key | `nil` | underscored model class name | the underscored model class name |
169
+ | 4 | options | `{}` | skinny_controllers_config options |
152
170
 
153
171
  ### For JSON-API
154
172
 
@@ -213,7 +231,13 @@ module UserOperations
213
231
  class Create < SkinnyControllers::Operation::Base
214
232
  def run
215
233
  @model = model_class.new(model_params)
216
- @model.save if allowed?
234
+
235
+ # raising an exception here allows the corresponding resource controller to
236
+ # `rescue_from SkinnyControllers::DeniedByPolicy` and have a uniform error
237
+ # returned to the frontend
238
+ raise SkinnyControllers::DeniedByPolicy.new('Something Horrible') unless allowed?
239
+
240
+ @model.save
217
241
  return @model # or just `model`
218
242
  end
219
243
  end
@@ -225,7 +249,9 @@ end
225
249
  module UserOperations
226
250
  class Update < SkinnyControllers::Operation::Base
227
251
  def run
228
- return unless allowed?
252
+ # this throws a DeniedByPolicy exception if `allowed?` returns false
253
+ check_allowed!
254
+
229
255
  model.update(model_params)
230
256
  model
231
257
  end
@@ -248,16 +274,7 @@ module UserOperations
248
274
  end
249
275
  ```
250
276
 
251
- And given that this method exists on the `User` model:
252
- ```ruby
253
- # realistically, you'd only want users to be able to access themselves
254
- def is_accessible_to?(user)
255
- self.id == user.id
256
- end
257
- ```
258
-
259
- Making a call to the destroy action on the `UsersController` will only succeed if the user trying to delete themselves. (Possibly to 'cancel their account')
260
-
277
+ NOTE: `allowed?` is `true` by default via the `SkinnyControllers.allow_by_default` option.
261
278
 
262
279
  ## Defining Policies
263
280
 
@@ -266,8 +283,8 @@ These are where you define your access logic, and how to decide if a user has ac
266
283
 
267
284
  ```ruby
268
285
  class EventPolicy < SkinnyControllers::Policy::Base
269
- def read?(o = object)
270
- o.is_accessible_to?(user)
286
+ def read?(event = object)
287
+ event.user == user
271
288
  end
272
289
  end
273
290
  ```
@@ -279,26 +296,20 @@ These are snippets taking from other projects.
279
296
 
280
297
  ### Finding a record when the id parameter isn't passed
281
298
 
282
-
283
-
284
299
  ```ruby
285
300
  module HostOperations
286
301
  class Read < SkinnyControllers::Operation::Base
287
302
  def run
288
- model # always allowed, never restricted
303
+ # always allowed, never restricted
304
+ # (because there is now call to allowed?)
305
+ model
289
306
  end
290
307
 
291
- # Needs to be overridden, because a 'host' can be either
292
- # an Event or an Organization.
293
- #
294
308
  # the params to this method should include the subdomain
295
309
  # e.g.: { subdomain: 'swingin2015' }
296
310
  def model_from_params
297
311
  subdomain = params[:subdomain]
298
- # first check the events, since those are more commonly used
299
- host = Event.find_by_domain(subdomain)
300
- # if the event doesn't exist, see if we have an organization
301
- host ||= Organization.find_by_domain(subdomain)
312
+ host = Host.find_by_subdomain(subdomain)
302
313
  end
303
314
  end
304
315
  end
@@ -337,7 +348,7 @@ module MembershipRenewalOperations
337
348
  # so, because the list is sorted by user id, then updated at,
338
349
  # for each user, the first renewal will be chosen...
339
350
  # and because it is descending, that means the most recent renewal
340
- sorted_renewals.uniq{|r| r.user_id}
351
+ sorted_renewals.uniq { |r| r.user_id }
341
352
  end
342
353
  end
343
354
 
@@ -353,6 +364,7 @@ module UserOperations
353
364
  class Update < SkinnyControllers::Operation::Base
354
365
  def run
355
366
  return unless allowed_for?(current_user)
367
+ # update with password provided by Devise
356
368
  current_user.update_with_password(model_params)
357
369
  current_user
358
370
  end
@@ -398,9 +410,9 @@ describe HostOperations do
398
410
  let(:operation){ HostOperations::Read.new(nil, { subdomain: subdomain }) }
399
411
 
400
412
  it 'finds an event' do
401
- event = create(:event, domain: subdomain)
413
+ host = create(:host, domain: subdomain)
402
414
  model = operation.run
403
- expect(model).to eq event
415
+ expect(model).to eq host
404
416
  end
405
417
  #...
406
418
  ```
@@ -461,12 +473,6 @@ describe PackagePolicy do
461
473
 
462
474
  ## Globally Configurable Options
463
475
 
464
- All of these can be set on `SkinnyControllers`,
465
- e.g.:
466
- ```ruby
467
- SkinnyControllers.controller_namespace = 'API'
468
- ```
469
-
470
476
  The following options are available:
471
477
 
472
478
  |Option|Default|Note|
@@ -476,15 +482,9 @@ The following options are available:
476
482
  |`policy_suffix`|`'Policy'` | Default suffix for policies classes. |
477
483
  |`controller_namespace`|`''`| Global Namespace for all controllers (e.g.: `'API'`) |
478
484
  |`allow_by_default`| `true` | Default permission |
479
- |`accessible_to_method`|`is_accessible_to?`| method to call an the object that the user might be able to access |
480
- |`accessible_to_scope`| `accessible_to`| scope / class method on an object that the user might be able to access |
481
485
  |`action_map`| see [skinny_controllers.rb](./lib/skinny_controllers.rb#L61)| |
482
486
 
483
487
 
484
-
485
-
486
-
487
-
488
488
  -------------------------------------------------------
489
489
 
490
490
  ## How is this different from trailblazer?
@@ -32,15 +32,6 @@ module SkinnyControllers
32
32
 
33
33
  POLICY_METHOD_SUFFIX = '?'
34
34
 
35
- # Tells the Diet what namespace of the controller
36
- # isn't going to be part of the model name
37
- #
38
- # @example
39
- # # config/initializers/skinny_controllers.rb
40
- # SkinnyControllers.controller_namespace = 'API'
41
- # # 'API::' would be removed from 'API::Namespace::ObjectNamesController'
42
- cattr_accessor :controller_namespace
43
-
44
35
  # Allows integration of a search gem, like ransack.
45
36
  # The scope of this proc is within an operation, so all operation
46
37
  # instance variables will be available.
@@ -71,26 +62,10 @@ module SkinnyControllers
71
62
  'Policy'
72
63
  end
73
64
 
74
- cattr_accessor :operations_namespace do
75
- ''
76
- end
77
-
78
- cattr_accessor :policies_namespace do
79
- ''
80
- end
81
-
82
65
  cattr_accessor :allow_by_default do
83
66
  true
84
67
  end
85
68
 
86
- cattr_accessor :accessible_to_method do
87
- :is_accessible_to?
88
- end
89
-
90
- cattr_accessor :accessible_to_scope do
91
- :accessible_to
92
- end
93
-
94
69
  # the diet uses ActionController::Base's
95
70
  # `action_name` method to get the current action.
96
71
  # From that action, we map what verb we want to use for our operation
@@ -3,14 +3,33 @@ module SkinnyControllers
3
3
  module Diet
4
4
  extend ActiveSupport::Concern
5
5
 
6
+ ALLOWED_OPTIONS = [
7
+ :model_class, :parent_class,
8
+ :asociation_name,
9
+ :model_params_key
10
+ ].freeze
11
+
6
12
  included do
7
13
  class << self
8
- attr_accessor :model_class
9
- attr_accessor :model_key
10
- attr_accessor :association_name
14
+ attr_accessor :options
15
+
16
+ def skinny_controllers_config(options = {})
17
+ @options = options.select { |o| ALLOWED_OPTIONS.include?(o) }
18
+ end
11
19
  end
12
20
  end
13
21
 
22
+ def create_operation(user:, params_for_action: nil)
23
+ operation_class.new(
24
+ user,
25
+ params,
26
+ params_for_action,
27
+ action_name,
28
+ _lookup,
29
+ _options
30
+ )
31
+ end
32
+
14
33
  # TODO: what if we want multiple operations per action?
15
34
  #
16
35
  # @return an instance of the operation with default parameters
@@ -18,9 +37,9 @@ module SkinnyControllers
18
37
  @operation ||= operation_class.new(
19
38
  current_user,
20
39
  params, params_for_action,
21
- action_name, self.class.model_key,
40
+ action_name,
22
41
  _lookup,
23
- self.class.association_name
42
+ _options
24
43
  )
25
44
  end
26
45
 
@@ -32,11 +51,15 @@ module SkinnyControllers
32
51
  _lookup.operation_class
33
52
  end
34
53
 
54
+ def _options
55
+ self.class.options || {}
56
+ end
57
+
35
58
  def _lookup
36
59
  @_lookup ||= Lookup.from_controller(
37
60
  controller_class: self.class,
38
61
  verb: verb_for_action,
39
- model_class: self.class.model_class
62
+ model_class: _options[:model_class]
40
63
  )
41
64
  end
42
65
 
@@ -64,9 +87,9 @@ module SkinnyControllers
64
87
  def params_for_action
65
88
  return {} if action_name == 'destroy'
66
89
 
67
- key = self.class.model_key
90
+ key = _options[:model_params_key]
68
91
  # model_class should be a class
69
- klass = self.class.model_class
92
+ klass = _options[:model_class]
70
93
 
71
94
  model_key =
72
95
  if key.present?
@@ -17,7 +17,7 @@ module SkinnyControllers
17
17
  )
18
18
  end
19
19
 
20
- def from_operation(operation_class:)
20
+ def from_operation(operation_class:, model_class:)
21
21
  qualified_name = operation_class.name
22
22
  parts = qualified_name.split('::')
23
23
  operation_name = parts[-2]
@@ -28,7 +28,7 @@ module SkinnyControllers
28
28
  # namespace: parts[0..-3],
29
29
  operation_name: operation_name,
30
30
  operation_class: operation_class,
31
- model_name: operation_parts.first,
31
+ model_class: model_class,
32
32
  namespace: qualified_name.deconstantize.deconstantize
33
33
  )
34
34
  end
@@ -87,7 +87,7 @@ module SkinnyControllers
87
87
  end
88
88
 
89
89
  def model_name
90
- @model_name ||= @model_class.try(:name) || resource_parts[-1].singularize
90
+ @model_name ||= @model_class.try(:name) || resource_name
91
91
  end
92
92
 
93
93
  # @return [String] name of the supposed operation class
@@ -101,7 +101,7 @@ module SkinnyControllers
101
101
  def namespaced_policy_name
102
102
  @namespaced_policy_name ||= [
103
103
  namespace,
104
- "#{model_name}#{SkinnyControllers.policy_suffix}"
104
+ "#{resource_name}#{SkinnyControllers.policy_suffix}"
105
105
  ].reject(&:blank?).join('::')
106
106
  end
107
107
 
@@ -113,7 +113,7 @@ module SkinnyControllers
113
113
  end
114
114
 
115
115
  def operation_name
116
- @operation_name ||= "#{model_name}#{SkinnyControllers.operations_suffix}"
116
+ @operation_name ||= "#{resource_name}#{SkinnyControllers.operations_suffix}"
117
117
  end
118
118
 
119
119
  # @return [String] the namespace
@@ -123,17 +123,27 @@ module SkinnyControllers
123
123
  end
124
124
  end
125
125
 
126
+ def resource_name
127
+ @resource_name ||= resource_parts && resource_parts[-1].singularize ||
128
+ @model_class&.name ||
129
+ operation_parts && operation_parts[-1].singularize
130
+ end
131
+
126
132
  # PostsController
127
133
  # => Posts
128
134
  #
129
135
  # Api::V2::PostsController
130
136
  # => Api, V2, Posts
131
137
  def resource_parts
132
- @resource_parts ||= controller_class_name.split(/::|Controller/)
138
+ @resource_parts ||= controller_class_name&.split(/::|Controller/)
139
+ end
140
+
141
+ def operation_parts
142
+ @operation_parts ||= operation_namespace&.split(/::|Operations/)
133
143
  end
134
144
 
135
145
  def controller_class_name
136
- @controller_class_name ||= @controller_class.name
146
+ @controller_class_name ||= @controller_class&.name
137
147
  end
138
148
  end
139
149
  end
@@ -24,11 +24,9 @@ module SkinnyControllers
24
24
 
25
25
  # Namespace::ModelOperations::Verb => Namespace::ModelOperations
26
26
  namespace = operation_name.deconstantize
27
- # Namespace::ModelOperations => ModelOperations
28
- # nested_namespace = namespace.demodulize
29
- nested_namespace = namespace.gsub(SkinnyControllers.operations_namespace, '')
27
+
30
28
  # ModelOperations => Model
31
- nested_namespace.gsub(SkinnyControllers.operations_suffix, '')
29
+ namespace.gsub(SkinnyControllers.operations_suffix, '')
32
30
  end
33
31
  end
34
32
  end
@@ -35,15 +35,11 @@ module SkinnyControllers
35
35
 
36
36
  # @return [Class] namespace for the default operation class
37
37
  def default_operation_namespace_for(model_name)
38
- # binding.pry
39
38
  desired_namespace = namespace_from_model(model_name)
40
- parent_namespace = SkinnyControllers.operations_namespace
41
-
42
- namespace_name = "#{parent_namespace}::#{desired_namespace}"
43
- namespace = namespace_name.safe_constantize
39
+ namespace = desired_namespace.safe_constantize
44
40
 
45
41
  unless namespace
46
- SkinnyControllers.logger.warn("#{namespace_name} not found. Creating...")
42
+ SkinnyControllers.logger.warn("#{desired_namespace} not found. Creating...")
47
43
  end
48
44
 
49
45
  namespace || Namespace.create_namespace(desired_namespace)
@@ -61,10 +57,8 @@ module SkinnyControllers
61
57
  # @param [String] the verb/action for the operation
62
58
  # @return [String] the operation based on the model name
63
59
  def name_from_model(model_name, verb)
64
- # this namespace is '' by default
65
- prefix = SkinnyControllers.operations_namespace
66
60
  namespace = Lookup::Operation.namespace_from_model(model_name)
67
- "#{prefix}::#{namespace}::#{verb}"
61
+ "#{namespace}::#{verb}"
68
62
  end
69
63
  end
70
64
  end
@@ -18,8 +18,7 @@ module SkinnyControllers
18
18
  end
19
19
 
20
20
  def class_name_from_model(name)
21
- parent_namespace = namespace.present? ? "#{namespace}::" : ''
22
- "#{parent_namespace}#{name}" + SkinnyControllers.policy_suffix
21
+ "#{name}#{SkinnyControllers.policy_suffix}"
23
22
  end
24
23
 
25
24
  def define_policy_class(name)
@@ -46,10 +45,6 @@ module SkinnyControllers
46
45
  def method_name_for_operation(class_name)
47
46
  class_name.demodulize.underscore + POLICY_METHOD_SUFFIX
48
47
  end
49
-
50
- def namespace
51
- SkinnyControllers.policies_namespace
52
- end
53
48
  end
54
49
  end
55
50
  end
@@ -18,7 +18,7 @@ module SkinnyControllers
18
18
 
19
19
  attr_accessor :params, :current_user, :authorized_via_parent,
20
20
  :action, :params_for_action, :model_key,
21
- :association_name,
21
+ :association_name, :options,
22
22
  :_lookup
23
23
 
24
24
  class << self
@@ -45,24 +45,27 @@ module SkinnyControllers
45
45
  # @param [Hash] controller_params the params hash raw from the controller
46
46
  # @param [Hash] params_for_action optional params hash, generally the result of strong parameters
47
47
  # @param [string] action the current action on the controller
48
- def initialize(current_user, controller_params,
49
- params_for_action = nil, action = nil,
50
- model_key = nil, lookup = nil,
51
- association_name = nil)
48
+ def initialize(current_user,
49
+ controller_params, params_for_action = nil,
50
+ action = nil,
51
+ lookup = nil,
52
+ options = {})
52
53
  self.authorized_via_parent = false
53
54
  self.current_user = current_user
54
55
  self.action = action || controller_params[:action]
55
56
  self.params = controller_params
56
57
  self.params_for_action = params_for_action || controller_params
57
- self.model_key = model_key
58
58
  self._lookup = lookup
59
- self.association_name = association_name
59
+ self.options = options
60
+ self.model_key = options[:model_params_key]
61
+ self.association_name = options[:association_name]
60
62
  end
61
63
 
62
64
  def lookup
63
65
  @lookup ||= begin
64
66
  _lookup || Lookup.from_operation(
65
- operation_class: self.class
67
+ operation_class: self.class,
68
+ model_class: options[:model_class]
66
69
  )
67
70
  end
68
71
  end
@@ -104,6 +107,10 @@ module SkinnyControllers
104
107
  allowed_for?(model)
105
108
  end
106
109
 
110
+ def check_allowed!(*args)
111
+ raise DeniedByPolicy(*args.presence || action) unless allowed?
112
+ end
113
+
107
114
  # checks the policy
108
115
  def allowed_for?(object)
109
116
  policy_for(object).send(policy_method_name)
@@ -46,7 +46,7 @@ module SkinnyControllers
46
46
  end
47
47
 
48
48
  def check_allowed!
49
- raise DeniedByPolicy, action unless allowed?
49
+ super(action)
50
50
  end
51
51
  end
52
52
  end
@@ -61,7 +61,15 @@ module SkinnyControllers
61
61
  unless @scoped_model
62
62
  klass_name = scoped_params[:type]
63
63
  operation_class = Lookup::Operation.operation_of(klass_name, DefaultVerbs::Read)
64
- operation = operation_class.new(current_user, id: scoped_params[:id])
64
+
65
+ params = { id: scoped_params[:id] }
66
+ operation = operation_class.new(
67
+ current_user,
68
+ params, params,
69
+ 'show', nil,
70
+ model_class: klass_name.safe_constantize
71
+ )
72
+
65
73
  @scoped_model = operation.run
66
74
  self.authorized_via_parent = !!@scoped_model
67
75
  end
@@ -70,16 +78,7 @@ module SkinnyControllers
70
78
  end
71
79
 
72
80
  def model_from_params
73
- ar_proxy = model_class.where(sanitized_params)
74
-
75
- if ar_proxy.respond_to? SkinnyControllers.accessible_to_scope
76
- # It's better to filter in sql, than in the app, so if there is
77
- # a way to do the filtering in active query, do that. This will help
78
- # mitigate n+1 query scenarios
79
- return ar_proxy.send(SkinnyControllers.accessible_to_scope, current_user)
80
- end
81
-
82
- ar_proxy
81
+ model_class.where(sanitized_params)
83
82
  end
84
83
 
85
84
  def model_from_named_id(key, id)
@@ -93,6 +92,7 @@ module SkinnyControllers
93
92
  def model_from_scope(scope = params[:scope])
94
93
  if scoped = scoped_model(scope)
95
94
  association = association_name_from_object
95
+
96
96
  scoped.send(association)
97
97
  else
98
98
  raise ActiveRecord::RecordNotFound, "Parent object of type #{scope[:type]} not accessible"
@@ -27,7 +27,7 @@ module SkinnyControllers
27
27
  # TODO: this means that a destroy method, if defined,
28
28
  # will never be called.... good or bad?
29
29
  # should there be a difference between delete and destroy?
30
- return send('delete?'.freeze) if action == 'destroy'.freeze
30
+ return send('delete?') if action == 'destroy'
31
31
 
32
32
  # we know that these methods don't take any parameters,
33
33
  # so args and block can be ignored
@@ -51,7 +51,6 @@ module SkinnyControllers
51
51
 
52
52
  # this should be used when checking access to a single object
53
53
  def read?(o = object)
54
- return o.send(accessible_method, user) if o.respond_to?(accessible_method)
55
54
  default?
56
55
  end
57
56
 
@@ -72,12 +71,6 @@ module SkinnyControllers
72
71
  accessible = object.map { |ea| read?(ea) }
73
72
  accessible.all?
74
73
  end
75
-
76
- private
77
-
78
- def accessible_method
79
- SkinnyControllers.accessible_to_method
80
- end
81
74
  end
82
75
  end
83
76
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module SkinnyControllers
3
- VERSION = '0.9.1'
3
+ VERSION = '0.10.0'
4
4
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: skinny_controllers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - L. Preston Sego III
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-11-26 00:00:00.000000000 Z
11
+ date: 2016-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -227,7 +227,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
227
227
  requirements:
228
228
  - - ">="
229
229
  - !ruby/object:Gem::Version
230
- version: '2.0'
230
+ version: '2.3'
231
231
  required_rubygems_version: !ruby/object:Gem::Requirement
232
232
  requirements:
233
233
  - - ">="
@@ -238,6 +238,6 @@ rubyforge_project:
238
238
  rubygems_version: 2.5.1
239
239
  signing_key:
240
240
  specification_version: 4
241
- summary: SkinnyControllers-0.9.1
241
+ summary: SkinnyControllers-0.10.0
242
242
  test_files: []
243
243
  has_rdoc: