simple_resource_controller 0.1.7 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 47980430e7b6f9e6e4e160644c0b15bef32f4fa7084be7fc1d84da28ba270f85
4
- data.tar.gz: 02fbe09e21a500beab18a9fcb38cea7467dacc607c26f4d65a9e8fb7cb945da7
3
+ metadata.gz: 11ecf5e2bc0b286fa0709a401ed41a7a204a15cd0cc54e4379a31ae70c77d492
4
+ data.tar.gz: d382ef1a1b0752b8cd8e5e23dcb247e9bfe485d01af6b4149765a0fa26768cd7
5
5
  SHA512:
6
- metadata.gz: 4e8380546a598b1e3c0ec73296e09824ff551b5b81788a633cdb930e0d216d54b07a5b2a1d109fcaab129805175b9c155b6a877eed0064e77157a8abb8ed4946
7
- data.tar.gz: 4079c1811ef11b80fa863d4c579c14c1688953beca269ed0dac2caedd526dcf122cad137d384261af49b8b605f161b27d8c0000d1c2e65e23b4f2d8e7915c19e
6
+ metadata.gz: 19582cab4d75ae48b61f42d92c3a9485949cd470f9e900b5565d9bcc92e21a8f5dd5c6e8faa9786429b751e0ee8fca2a9c8fa4f8f2b281e58dcf1948c3a0b922
7
+ data.tar.gz: aedab8f8ca87baac41c871668af80e392c7f064c7d27a4429e3864db17fb7bd226afa5a2b9f56f0259852c77aab2dd3a47cc066c4070552a790f5aff2f5c9502
data/README.md CHANGED
@@ -63,6 +63,36 @@ class AnotherArticlesController < ApplicationController
63
63
  end
64
64
  ```
65
65
 
66
+ ### API examples
67
+
68
+ Gem suppports [jbuilder](https://github.com/rails/jbuilder) and [activemodel_serializer](https://github.com/rails-api/active_model_serializers) as API serializers
69
+
70
+ #### JBuilder
71
+
72
+ ```ruby
73
+ resource_api jbuilder: true
74
+ ```
75
+
76
+ But you will also need to add all view files for your actions, including `new` and `edit`.
77
+
78
+ **You can find example inside tests.**
79
+
80
+ #### ActiveModel::Serializer
81
+
82
+ Minimum config:
83
+
84
+ ```ruby
85
+ resource_api activemodel_serializer: { }
86
+ ```
87
+
88
+ All options:
89
+
90
+ ```ruby
91
+ resource_api activemodel_serializer: { record_serializer: MyArticleSerializer, error_serializer: MyErrorSerializer }
92
+ ```
93
+
94
+ **You can find example inside tests.**
95
+
66
96
  ### Controller configuration
67
97
 
68
98
  The first required configuration is an action name.
@@ -394,6 +424,11 @@ This is my favorite one. The `responders` gem follows the next logic - if a reco
394
424
  If you will get this exception - check your ActiveRecord callbacks, your code has some smells.
395
425
 
396
426
 
427
+ #### `error_serializer should be configured for the activemodel API`
428
+
429
+ You are trying to use the `resource_api` DSL to setup the activemodel_serializer, faced with the validation error in create or update action.
430
+ But didn't configured an error serializer: `resource_api activemodel_serializer: { error_serializer: MyErrorSerializer }`
431
+
397
432
  ## Contributing
398
433
 
399
434
  Bug reports and pull requests are welcome on GitHub at https://github.com/c3gdlk/simple_resource_controller. This project is intended to be a safe, welcoming space for collaboration.
@@ -26,8 +26,7 @@ module SimpleResourceController
26
26
  def create(options={}, &block)
27
27
  build_resource
28
28
  success = save_resource_and_respond!(options, &block)
29
- ensure
30
- setup_flash_messages(after_create_messages) if success
29
+ setup_flash_messages(after_create_messages) if success && !current_controller_api?
31
30
  end
32
31
  alias :create! :create
33
32
  end
@@ -42,8 +41,7 @@ module SimpleResourceController
42
41
  module Update
43
42
  def update(options={}, &block)
44
43
  success = save_resource_and_respond!(options, &block)
45
- ensure
46
- setup_flash_messages(after_update_messages) if success
44
+ setup_flash_messages(after_update_messages) if success && !current_controller_api?
47
45
  end
48
46
  alias :update! :update
49
47
  end
@@ -52,7 +50,7 @@ module SimpleResourceController
52
50
  def destroy(options={}, &block)
53
51
  destroy_resource_and_respond!(options, &block)
54
52
  ensure
55
- setup_flash_messages(after_destroy_messages)
53
+ setup_flash_messages(after_destroy_messages) unless current_controller_api?
56
54
  end
57
55
  alias :destroy! :destroy
58
56
  end
@@ -60,6 +58,20 @@ module SimpleResourceController
60
58
  module CommonMethods
61
59
  private
62
60
 
61
+ def current_controller_api?
62
+ self.class.api_config.present?
63
+ end
64
+
65
+ def activemodel_serializer?
66
+ current_controller_api? && self.class.api_config.dig(:activemodel_serializer).present?
67
+ end
68
+
69
+ def render_resource_with_activemodel_serializer(options)
70
+ record_serializer = self.class.api_config.dig(:activemodel_serializer, :record_serializer)
71
+
72
+ render({ json: resource, status: :ok }.merge(record_serializer ? { serializer: record_serializer } : {} ).merge(options))
73
+ end
74
+
63
75
  def collection
64
76
  return instance_variable_get(:"@#{collection_name}") if instance_variable_get(:"@#{collection_name}").present?
65
77
  instance_variable_set(:"@#{collection_name}", apply_scopes_and_pagination(association_chain))
@@ -159,11 +171,15 @@ module SimpleResourceController
159
171
  def destroy_resource_and_respond!(options={}, &block)
160
172
  resource.destroy
161
173
 
162
- unless block_given? || options[:location].present?
174
+ unless block_given? || options[:location].present? || current_controller_api?
163
175
  options[:location] = after_destroy_redirect_path
164
176
  end
165
177
 
166
- respond_with resource, options, &block
178
+ if activemodel_serializer?
179
+ render_resource_with_activemodel_serializer(options)
180
+ else
181
+ respond_with resource, options, &block
182
+ end
167
183
  end
168
184
 
169
185
  def save_resource_and_respond!(options={}, &block)
@@ -175,12 +191,21 @@ module SimpleResourceController
175
191
  end
176
192
 
177
193
  if result.present?
178
- unless block_given? || options[:location].present?
194
+ unless block_given? || options[:location].present? || current_controller_api?
179
195
  options[:location] = after_save_redirect_path
180
196
  end
197
+ elsif activemodel_serializer?
198
+ error_serializer = self.class.api_config.dig(:activemodel_serializer, :error_serializer)
199
+
200
+ raise "error_serializer should be configured for the activemodel API" unless error_serializer.present?
201
+ options[:serializer] = error_serializer
181
202
  end
182
203
 
183
- respond_with resource, options, &block
204
+ if result.present? && activemodel_serializer?
205
+ render_resource_with_activemodel_serializer(options)
206
+ else
207
+ respond_with resource, options, &block
208
+ end
184
209
 
185
210
  result
186
211
  end
@@ -258,6 +283,14 @@ module SimpleResourceController
258
283
  def paginate_collection(value)
259
284
  @paginate_collection_config = value
260
285
  end
286
+
287
+ def api_config
288
+ @api_config
289
+ end
290
+
291
+ def resource_api(value)
292
+ @api_config = value
293
+ end
261
294
  end
262
295
 
263
296
  class ActionsBuilder
@@ -1,3 +1,3 @@
1
1
  module SimpleResourceController
2
- VERSION = "0.1.7"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -22,6 +22,8 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "bundler"
23
23
  spec.add_development_dependency "rake"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "jbuilder"
26
+ spec.add_development_dependency 'active_model_serializers', '~> 0.10.0'
25
27
 
26
28
  spec.add_dependency "railties"
27
29
  spec.add_dependency "actionpack"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: simple_resource_controller
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.7
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Oleg Zaporozhchenko
@@ -52,6 +52,34 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: jbuilder
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: active_model_serializers
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.10.0
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.10.0
55
83
  - !ruby/object:Gem::Dependency
56
84
  name: railties
57
85
  requirement: !ruby/object:Gem::Requirement