responders 2.0.2 → 3.0.1

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
- SHA1:
3
- metadata.gz: 1048b35bc57148e916fc54ea72aa8a0e3f9f7498
4
- data.tar.gz: 8d4c1c0825d565528c29371185d374e8266336ff
2
+ SHA256:
3
+ metadata.gz: 00a016ab308a0960fc75a6dc1d6f8b35b3165fe0edfef25cb3b898631c7c0454
4
+ data.tar.gz: bf658c0505d528307b5b61b9c1854fa76b50269c7ddedc27f7c3816e588c2a1f
5
5
  SHA512:
6
- metadata.gz: 2cd86b1e17658300952e4fea7326eafc6474d9b47ee7520322521a103300fa3ad803ed41c5c7849febdf0769bb7f43085d2898fe589d0b85cc835a9017f7e07c
7
- data.tar.gz: f390f3b7d962ede7cda0b454d45b7864d2606472c33029a24981d84374be0ba8d8f98536aa5af2ef9aa4c0f915e4d2750a2f06278cf4113f82f35e30ceb5dc6a
6
+ metadata.gz: 316cf7158bbfede88e505b1b2dfe25cf86ef873f678362da6062d5b4093849a190da2f730265021e7a3613f5a5bb1622553bc423d8850226ee5235083a9cf38b
7
+ data.tar.gz: 7aa5dbc3ef20b9c7ddafa0d8342067eaccfc2b50231eef76c00cf7c9a5e07703d449110ee4ec8dc4f3dcb9fa7c06472e0635cc3c41d05820a193c9f7445d14e7
data/CHANGELOG.md CHANGED
@@ -1,3 +1,50 @@
1
+ ## 3.0.1
2
+
3
+ * Add support to Ruby 2.7
4
+
5
+ ## 3.0.0
6
+
7
+ * Remove support for Rails 4.2
8
+ * Remove support for Ruby < 2.4
9
+
10
+ ## 2.4.1
11
+
12
+ * Add support for Rails 6 beta
13
+
14
+ ## 2.4.0
15
+
16
+ * `respond_with` now accepts a new kwargs called `:render` which goes straight to the `render`
17
+ call after an unsuccessful post request. Usefull if for example you need to render a template
18
+ which is outside of controller's path eg:
19
+
20
+ `respond_with resource, render: { template: 'path/to/template' }`
21
+
22
+ ## 2.3.0
23
+
24
+ * `verify_request_format!` is aliased to `verify_requested_format!` now.
25
+ * Implementing the `interpolation_options` method on your controller is deprecated
26
+ in favor of naming it `flash_interpolation_options` instead.
27
+
28
+ ## 2.2.0
29
+
30
+ * Added the `verify_request_format!` method, that can be used as a `before_action`
31
+ callback to prevent your actions from being invoked when the controller does
32
+ not respond to the request mime type, preventing the execution of complex
33
+ queries or creating/deleting records from your app.
34
+
35
+ ## 2.1.2
36
+
37
+ * Fix rendering when using `ActionController::API`. (by @eLod)
38
+ * Added API controller template for the controller generator. (by @vestimir)
39
+
40
+ ## 2.1.1
41
+
42
+ * Added support for Rails 5.
43
+
44
+ ## 2.1.0
45
+
46
+ * No longer automatically set the responders generator as many projects may use this gem as a dependency. When upgrading, users will need to add `config.app_generators.scaffold_controller :responders_controller` to their application. The `responders:install` generator has been updated to automatically insert it in new applications
47
+
1
48
  ## 2.0.1
2
49
 
3
50
  * Require `rails/railtie` explicitly before using it
@@ -8,7 +55,7 @@
8
55
 
9
56
  * Import `respond_with` and class-level `respond_to` from Rails
10
57
  * Support only Rails ~> 4.2
11
- * `Responders::LocationResponder` is now included by in the default responder (and therefore deprecated)
58
+ * `Responders::LocationResponder` is now included by the default responder (and therefore deprecated)
12
59
 
13
60
  ## 1.1.0
14
61
 
data/MIT-LICENSE CHANGED
@@ -1,4 +1,5 @@
1
- Copyright 2009-2014 Plataforma Tecnologia. http://blog.plataformatec.com.br
1
+ Copyright (c) 2020 Rafael França, Carlos Antônio da Silva
2
+ Copyright 2009-2019 Plataformatec. http://plataformatec.com.br
2
3
 
3
4
  Permission is hereby granted, free of charge, to any person obtaining
4
5
  a copy of this software and associated documentation files (the
data/README.md CHANGED
@@ -1,10 +1,25 @@
1
1
  # Responders
2
2
 
3
- [![Gem Version](https://fury-badge.herokuapp.com/rb/responders.png)](http://badge.fury.io/rb/responders)
4
- [![Build Status](https://api.travis-ci.org/plataformatec/responders.png?branch=master)](http://travis-ci.org/plataformatec/responders)
5
- [![Code Climate](https://codeclimate.com/github/plataformatec/responders.png)](https://codeclimate.com/github/plataformatec/responders)
3
+ [![Gem Version](https://fury-badge.herokuapp.com/rb/responders.svg)](http://badge.fury.io/rb/responders)
4
+ [![Build Status](https://api.travis-ci.org/plataformatec/responders.svg?branch=master)](http://travis-ci.org/heartcombo/responders)
5
+ [![Code Climate](https://codeclimate.com/github/plataformatec/responders.svg)](https://codeclimate.com/github/heartcombo/responders)
6
6
 
7
- A set of responders modules to dry up your Rails 3.2+ app.
7
+ A set of responders modules to dry up your Rails app.
8
+
9
+ ## Installation
10
+
11
+ Add the responders gem to your Gemfile:
12
+
13
+ gem "responders"
14
+
15
+ Update your bundle and run the install generator:
16
+
17
+ $ bundle install
18
+ $ rails g responders:install
19
+
20
+ If you are including this gem to support backwards compatibilty for responders in previous releases of Rails, you only need to include the gem and bundle.
21
+
22
+ $ bundle install
8
23
 
9
24
  ## Responders Types
10
25
 
@@ -60,15 +75,27 @@ You can also have embedded HTML. Just create a `_html` scope.
60
75
 
61
76
  See also the `namespace_lookup` option to search the full hierarchy of possible keys.
62
77
 
78
+ ### HttpCacheResponder
79
+
80
+ Automatically adds Last-Modified headers to API requests. This
81
+ allows clients to easily query the server if a resource changed and if the client tries
82
+ to retrieve a resource that has not been modified, it returns not_modified status.
83
+
84
+ ### CollectionResponder
85
+
86
+ Makes your create and update action redirect to the collection on success.
87
+
63
88
  ### LocationResponder
64
89
 
65
90
  This responder allows you to use callable objects as the redirect location.
66
91
  Useful when you want to use the `respond_with` method with
67
92
  a custom route that requires persisted objects, but the validation may fail.
68
93
 
94
+ Note: this responder is included by default, and doesn't need to be included
95
+ on the top of your controller (including it will issue a deprecation warning).
96
+
69
97
  ```ruby
70
98
  class ThingsController < ApplicationController
71
- responders :location, :flash
72
99
  respond_to :html
73
100
 
74
101
  def create
@@ -78,59 +105,48 @@ class ThingsController < ApplicationController
78
105
  end
79
106
  ```
80
107
 
81
- ### HttpCacheResponder
82
-
83
- Automatically adds Last-Modified headers to API requests. This
84
- allows clients to easily query the server if a resource changed and if the client tries
85
- to retrieve a resource that has not been modified, it returns not_modified status.
86
-
87
- ### CollectionResponder
88
-
89
- Makes your create and update action redirect to the collection on success.
108
+ **Dealing with namespaced routes**
90
109
 
91
- ## Configuring your own responder
110
+ In order for the LocationResponder to find the correct route helper for namespaced routes you need to pass the namespaces to `respond_with`:
92
111
 
93
- The first step is to install the responders gem and configure it in your application:
112
+ ```ruby
113
+ class Api::V1::ThingsController < ApplicationController
114
+ respond_to :json
94
115
 
95
- ```console
96
- gem install responders
116
+ # POST /api/v1/things
117
+ def create
118
+ @thing = Thing.create(thing_params)
119
+ respond_with :api, :v1, @thing
120
+ end
121
+ end
97
122
  ```
98
123
 
99
- In your Gemfile, add this line:
100
-
101
- ```ruby
102
- gem 'responders'
103
- ```
124
+ ## Configuring your own responder
104
125
 
105
- Responders only provides a set of modules, to use them, you have to create your own
106
- responder. This can be done inside the lib folder for example:
126
+ Responders only provides a set of modules and to use them you have to create your own
127
+ responder. After you run the install command, the following responder will be
128
+ generated in your application:
107
129
 
108
130
  ```ruby
109
- # lib/app_responder.rb
110
- class AppResponder < ActionController::Responder
131
+ # lib/application_responder.rb
132
+ class ApplicationResponder < ActionController::Responder
111
133
  include Responders::FlashResponder
112
134
  include Responders::HttpCacheResponder
113
135
  end
114
136
  ```
115
137
 
116
- And then you need to configure your application to use it:
138
+ Your application also needs to be configured to use it:
117
139
 
118
140
  ```ruby
119
141
  # app/controllers/application_controller.rb
120
- require "app_responder"
142
+ require "application_responder"
121
143
 
122
144
  class ApplicationController < ActionController::Base
123
- self.responder = AppResponder
145
+ self.responder = ApplicationResponder
124
146
  respond_to :html
125
147
  end
126
148
  ```
127
149
 
128
- Or, for your convenience, just do:
129
-
130
- ```console
131
- rails generate responders:install
132
- ```
133
-
134
150
  ## Controller method
135
151
 
136
152
  This gem also includes the controller method `responders`, which allows you to cherry-pick which
@@ -144,7 +160,7 @@ end
144
160
 
145
161
  ## Interpolation Options
146
162
 
147
- You can pass in extra interpolation options for the translation by adding an `interpolation_options` method to your controller:
163
+ You can pass in extra interpolation options for the translation by adding an `flash_interpolation_options` method to your controller:
148
164
 
149
165
  ```ruby
150
166
  class InvitationsController < ApplicationController
@@ -157,33 +173,86 @@ class InvitationsController < ApplicationController
157
173
 
158
174
  private
159
175
 
160
- def interpolation_options
176
+ def flash_interpolation_options
161
177
  { resource_name: @invitation.email }
162
178
  end
163
179
  end
164
180
  ```
165
181
 
166
- Now you would see the message "bob@bob.com was successfully created" instead of the default "Invitation was successfully created."
182
+ Now you would see the message `"name@example.com was successfully created"` instead of the default `"Invitation was successfully created."`
167
183
 
168
184
  ## Generator
169
185
 
170
186
  This gem also includes a responders controller generator, so your scaffold can be customized
171
- to use `respond_with` instead of default `respond_to` blocks. Installing this gem automatically
172
- sets the generator.
187
+ to use `respond_with` instead of default `respond_to` blocks. From 2.1, you need to explicitly opt-in to use this generator by adding the following to your `config/application.rb`:
188
+
189
+ ```ruby
190
+ config.app_generators.scaffold_controller :responders_controller
191
+ ```
192
+
193
+ ## Failure handling
194
+
195
+ Responders don't use `valid?` to check for errors in models to figure out if
196
+ the request was successful or not, and relies on your controllers to call
197
+ `save` or `create` to trigger the validations.
198
+
199
+ ```ruby
200
+ def create
201
+ @widget = Widget.new(widget_params)
202
+ # @widget will be a valid record for responders, as we haven't called `save`
203
+ # on it, and will always redirect to the `widgets_path`.
204
+ respond_with @widget, location: -> { widgets_path }
205
+ end
206
+ ```
207
+
208
+ Responders will check if the `errors` object in your model is empty or not. Take
209
+ this in consideration when implementing different actions or writing test
210
+ assertions on this behavior for your controllers.
211
+
212
+ ```ruby
213
+ def create
214
+ @widget = Widget.new(widget_params)
215
+ @widget.errors.add(:base, :invalid)
216
+ # `respond_with` will render the `new` template again.
217
+ respond_with @widget
218
+ end
219
+ ```
220
+
221
+ ## Verifying request formats
222
+
223
+ `respond_with` will raise an `ActionController::UnknownFormat` if the request
224
+ MIME type was not configured through the class level `respond_to`, but the
225
+ action will still be executed and any side effects (like creating a new record)
226
+ will still occur. To raise the `UnknownFormat` exception before your action
227
+ is invoked you can set the `verify_requested_format!` method as a `before_action`
228
+ on your controller.
229
+
230
+ ```ruby
231
+ class WidgetsController < ApplicationController
232
+ respond_to :json
233
+ before_action :verify_requested_format!
234
+
235
+ # POST /widgets.html won't reach the `create` action.
236
+ def create
237
+ widget = Widget.create(widget_params)
238
+ respond_with widget
239
+ end
240
+ end
241
+
242
+ ```
173
243
 
174
244
  ## Examples
175
245
 
176
- Want more examples ? Check out this blog posts:
246
+ Want more examples ? Check out these blog posts:
177
247
 
178
- * [One in Three: Inherited Resources, Has Scope and Responders](http://blog.plataformatec.com.br/2009/12/one-in-three-inherited-resources-has-scope-and-responders/)
179
248
  * [Embracing REST with mind, body and soul](http://blog.plataformatec.com.br/2009/08/embracing-rest-with-mind-body-and-soul/)
180
249
  * [Three reasons to love ActionController::Responder](http://weblog.rubyonrails.org/2009/8/31/three-reasons-love-responder/)
181
- * [My five favorite things about Rails 3](http://www.engineyard.com/blog/2009/my-five-favorite-things-about-rails-3/)
250
+ * [My five favorite things about Rails 3](http://www.engineyard.com/blog/2009/my-five-favorite-things-about-rails-3)
182
251
 
183
252
  ## Bugs and Feedback
184
253
 
185
254
  If you discover any bugs or want to drop a line, feel free to create an issue on GitHub.
186
255
 
187
- http://github.com/plataformatec/responders/issues
256
+ http://github.com/heartcombo/responders/issues
188
257
 
189
- MIT License. Copyright 2009-2014 Plataforma Tecnologia. http://blog.plataformatec.com.br
258
+ MIT License. Copyright 2020 Rafael França, Carlos Antônio da Silva. Copyright 2009-2019 Plataformatec.
@@ -1,5 +1,7 @@
1
- require 'active_support/core_ext/array/extract_options'
2
- require 'action_controller/metal/mime_responds'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/core_ext/array/extract_options"
4
+ require "action_controller/metal/mime_responds"
3
5
 
4
6
  module ActionController #:nodoc:
5
7
  module RespondWith
@@ -37,17 +39,17 @@ module ActionController #:nodoc:
37
39
  def respond_to(*mimes)
38
40
  options = mimes.extract_options!
39
41
 
40
- only_actions = Array(options.delete(:only)).map(&:to_s)
41
- except_actions = Array(options.delete(:except)).map(&:to_s)
42
+ only_actions = Array(options.delete(:only)).map(&:to_sym)
43
+ except_actions = Array(options.delete(:except)).map(&:to_sym)
42
44
 
43
- new = mimes_for_respond_to.dup
45
+ hash = mimes_for_respond_to.dup
44
46
  mimes.each do |mime|
45
47
  mime = mime.to_sym
46
- new[mime] = {}
47
- new[mime][:only] = only_actions unless only_actions.empty?
48
- new[mime][:except] = except_actions unless except_actions.empty?
48
+ hash[mime] = {}
49
+ hash[mime][:only] = only_actions unless only_actions.empty?
50
+ hash[mime][:except] = except_actions unless except_actions.empty?
49
51
  end
50
- self.mimes_for_respond_to = new.freeze
52
+ self.mimes_for_respond_to = hash.freeze
51
53
  end
52
54
 
53
55
  # Clear all mime types in <tt>respond_to</tt>.
@@ -175,26 +177,34 @@ module ActionController #:nodoc:
175
177
  # Also, a hash passed to +respond_with+ immediately after the specified
176
178
  # resource(s) is interpreted as a set of options relevant to all
177
179
  # formats. Any option accepted by +render+ can be used, e.g.
180
+ #
178
181
  # respond_with @people, status: 200
182
+ #
179
183
  # However, note that these options are ignored after an unsuccessful attempt
180
184
  # to save a resource, e.g. when automatically rendering <tt>:new</tt>
181
185
  # after a post request.
182
186
  #
183
- # Two additional options are relevant specifically to +respond_with+ -
187
+ # Three additional options are relevant specifically to +respond_with+ -
184
188
  # 1. <tt>:location</tt> - overwrites the default redirect location used after
185
189
  # a successful html +post+ request.
186
190
  # 2. <tt>:action</tt> - overwrites the default render action used after an
187
191
  # unsuccessful html +post+ request.
192
+ # 3. <tt>:render</tt> - allows to pass any options directly to the <tt>:render<tt/>
193
+ # call after unsuccessful html +post+ request. Useful if for example you
194
+ # need to render a template which is outside of controller's path or you
195
+ # want to override the default http <tt>:status</tt> code, e.g.
196
+ #
197
+ # respond_with(resource, render: { template: 'path/to/template', status: 422 })
188
198
  def respond_with(*resources, &block)
189
199
  if self.class.mimes_for_respond_to.empty?
190
200
  raise "In order to use respond_with, first you need to declare the " \
191
201
  "formats your controller responds to in the class level."
192
202
  end
193
203
 
194
- mimes = collect_mimes_from_class_level()
204
+ mimes = collect_mimes_from_class_level
195
205
  collector = ActionController::MimeResponds::Collector.new(mimes, request.variant)
196
206
  block.call(collector) if block_given?
197
-
207
+
198
208
  if format = collector.negotiate_format(request)
199
209
  _process_format(format)
200
210
  options = resources.size == 1 ? {} : resources.extract_options!
@@ -206,12 +216,31 @@ module ActionController #:nodoc:
206
216
  end
207
217
  end
208
218
 
209
- protected
219
+ protected
220
+
221
+ # Before action callback that can be used to prevent requests that do not
222
+ # match the mime types defined through <tt>respond_to</tt> from being executed.
223
+ #
224
+ # class PeopleController < ApplicationController
225
+ # respond_to :html, :xml, :json
226
+ #
227
+ # before_action :verify_requested_format!
228
+ # end
229
+ def verify_requested_format!
230
+ mimes = collect_mimes_from_class_level
231
+ collector = ActionController::MimeResponds::Collector.new(mimes, request.variant)
232
+
233
+ unless collector.negotiate_format(request)
234
+ raise ActionController::UnknownFormat
235
+ end
236
+ end
237
+
238
+ alias :verify_request_format! :verify_requested_format!
210
239
 
211
240
  # Collect mimes declared in the class method respond_to valid for the
212
241
  # current action.
213
242
  def collect_mimes_from_class_level #:nodoc:
214
- action = action_name.to_s
243
+ action = action_name.to_sym
215
244
 
216
245
  self.class.mimes_for_respond_to.keys.select do |mime|
217
246
  config = self.class.mimes_for_respond_to[mime]
@@ -226,4 +255,4 @@ module ActionController #:nodoc:
226
255
  end
227
256
  end
228
257
  end
229
- end
258
+ end
@@ -1,4 +1,6 @@
1
- require 'active_support/json'
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support/json"
2
4
 
3
5
  module ActionController #:nodoc:
4
6
  # Responsible for exposing a resource to different mime requests,
@@ -121,12 +123,12 @@ module ActionController #:nodoc:
121
123
  attr_reader :controller, :request, :format, :resource, :resources, :options
122
124
 
123
125
  DEFAULT_ACTIONS_FOR_VERBS = {
124
- :post => :new,
125
- :patch => :edit,
126
- :put => :edit
126
+ post: :new,
127
+ patch: :edit,
128
+ put: :edit
127
129
  }
128
130
 
129
- def initialize(controller, resources, options={})
131
+ def initialize(controller, resources, options = {})
130
132
  @controller = controller
131
133
  @request = @controller.request
132
134
  @format = @controller.formats.first
@@ -142,8 +144,8 @@ module ActionController #:nodoc:
142
144
  end
143
145
  end
144
146
 
145
- delegate :head, :render, :redirect_to, :to => :controller
146
- delegate :get?, :post?, :patch?, :put?, :delete?, :to => :request
147
+ delegate :head, :render, :redirect_to, to: :controller
148
+ delegate :get?, :post?, :patch?, :put?, :delete?, to: :request
147
149
 
148
150
  # Undefine :to_json and :to_yaml since it's defined on Object
149
151
  undef_method(:to_json) if method_defined?(:to_json)
@@ -182,10 +184,12 @@ module ActionController #:nodoc:
182
184
  # responds to :to_format and display it.
183
185
  #
184
186
  def to_format
185
- if get? || !has_errors? || response_overridden?
187
+ if !get? && has_errors? && !response_overridden?
188
+ display_errors
189
+ elsif has_view_rendering? || response_overridden?
186
190
  default_render
187
191
  else
188
- display_errors
192
+ api_behavior
189
193
  end
190
194
  rescue ActionView::MissingTemplate
191
195
  api_behavior
@@ -198,7 +202,7 @@ module ActionController #:nodoc:
198
202
  if get?
199
203
  raise error
200
204
  elsif has_errors? && default_action
201
- render :action => default_action
205
+ render rendering_options
202
206
  else
203
207
  redirect_to navigation_location
204
208
  end
@@ -211,7 +215,7 @@ module ActionController #:nodoc:
211
215
  if get?
212
216
  display resource
213
217
  elsif post?
214
- display resource, :status => :created, :location => api_location
218
+ display resource, status: :created, location: api_location
215
219
  else
216
220
  head :no_content
217
221
  end
@@ -233,7 +237,7 @@ module ActionController #:nodoc:
233
237
  if @default_response
234
238
  @default_response.call(options)
235
239
  else
236
- controller.default_render(options)
240
+ controller.render(options)
237
241
  end
238
242
  end
239
243
 
@@ -254,7 +258,7 @@ module ActionController #:nodoc:
254
258
  #
255
259
  # render xml: @user, status: :created
256
260
  #
257
- def display(resource, given_options={})
261
+ def display(resource, given_options = {})
258
262
  controller.render given_options.merge!(options).merge!(format => resource)
259
263
  end
260
264
 
@@ -273,6 +277,10 @@ module ActionController #:nodoc:
273
277
  Renderers::RENDERERS.include?(format)
274
278
  end
275
279
 
280
+ def has_view_rendering?
281
+ controller.class.include? ActionView::Rendering
282
+ end
283
+
276
284
  # By default, render the <code>:edit</code> action for HTML requests with errors, unless
277
285
  # the verb was POST.
278
286
  #
@@ -285,11 +293,19 @@ module ActionController #:nodoc:
285
293
  end
286
294
 
287
295
  def json_resource_errors
288
- {:errors => resource.errors}
296
+ { errors: resource.errors }
289
297
  end
290
298
 
291
299
  def response_overridden?
292
300
  @default_response.present?
293
301
  end
302
+
303
+ def rendering_options
304
+ if options[:render]
305
+ options[:render]
306
+ else
307
+ { action: default_action }
308
+ end
309
+ end
294
310
  end
295
311
  end
@@ -1,4 +1,6 @@
1
- require 'rails/generators/rails/scaffold_controller/scaffold_controller_generator'
1
+ # frozen_string_literal: true
2
+
3
+ require "rails/generators/rails/scaffold_controller/scaffold_controller_generator"
2
4
 
3
5
  module Rails
4
6
  module Generators
@@ -15,32 +17,8 @@ module Rails
15
17
  end
16
18
  end
17
19
 
18
- def orm_instance_update(params)
19
- if orm_instance.respond_to?(:update)
20
- orm_instance.update params
21
- else
22
- orm_instance.update_attributes params
23
- end
24
- end
25
-
26
- def controller_before_filter
27
- if ActionController::Base.respond_to?(:before_action)
28
- "before_action"
29
- else
30
- "before_filter"
31
- end
32
- end
33
-
34
20
  def attributes_params
35
- if strong_parameters_defined?
36
- "#{file_name}_params"
37
- else
38
- "params[:#{file_name}]"
39
- end
40
- end
41
-
42
- def strong_parameters_defined?
43
- defined?(ActionController::StrongParameters)
21
+ "#{singular_table_name}_params"
44
22
  end
45
23
  end
46
24
  end
@@ -0,0 +1,51 @@
1
+ <% if namespaced? -%>
2
+ require_dependency "<%= namespaced_file_path %>/application_controller"
3
+
4
+ <% end -%>
5
+ <% module_namespacing do -%>
6
+ class <%= controller_class_name %>Controller < ApplicationController
7
+ before_action :set_<%= singular_table_name %>, only: [:show, :update, :destroy]
8
+
9
+ respond_to :json
10
+
11
+ <% unless options[:singleton] -%>
12
+ def index
13
+ @<%= plural_table_name %> = <%= orm_class.all(class_name) %>
14
+ respond_with(@<%= plural_table_name %>)
15
+ end
16
+ <% end -%>
17
+
18
+ def show
19
+ respond_with(@<%= singular_table_name %>)
20
+ end
21
+
22
+ def create
23
+ @<%= singular_table_name %> = <%= orm_class.build(class_name, attributes_params) %>
24
+ <%= "flash[:notice] = '#{class_name} was successfully created.' if " if flash? %>@<%= orm_instance.save %>
25
+ respond_with(@<%= singular_table_name %>)
26
+ end
27
+
28
+ def update
29
+ <%= "flash[:notice] = '#{class_name} was successfully updated.' if " if flash? %>@<%= orm_instance.update(attributes_params) %>
30
+ respond_with(@<%= singular_table_name %>)
31
+ end
32
+
33
+ def destroy
34
+ @<%= orm_instance.destroy %>
35
+ respond_with(@<%= singular_table_name %>)
36
+ end
37
+
38
+ private
39
+ def set_<%= singular_table_name %>
40
+ @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
41
+ end
42
+
43
+ def <%= "#{singular_table_name}_params" %>
44
+ <%- if attributes_names.empty? -%>
45
+ params[:<%= singular_table_name %>]
46
+ <%- else -%>
47
+ params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
48
+ <%- end -%>
49
+ end
50
+ end
51
+ <% end -%>
@@ -1,6 +1,10 @@
1
+ <% if namespaced? -%>
2
+ require_dependency "<%= namespaced_file_path %>/application_controller"
3
+
4
+ <% end -%>
1
5
  <% module_namespacing do -%>
2
6
  class <%= controller_class_name %>Controller < ApplicationController
3
- <%= controller_before_filter %> :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
7
+ before_action :set_<%= singular_table_name %>, only: [:show, :edit, :update, :destroy]
4
8
 
5
9
  respond_to :html
6
10
 
@@ -30,7 +34,7 @@ class <%= controller_class_name %>Controller < ApplicationController
30
34
  end
31
35
 
32
36
  def update
33
- <%= "flash[:notice] = '#{class_name} was successfully updated.' if " if flash? %>@<%= orm_instance_update(attributes_params) %>
37
+ <%= "flash[:notice] = '#{class_name} was successfully updated.' if " if flash? %>@<%= orm_instance.update(attributes_params) %>
34
38
  respond_with(@<%= singular_table_name %>)
35
39
  end
36
40
 
@@ -43,7 +47,6 @@ class <%= controller_class_name %>Controller < ApplicationController
43
47
  def set_<%= singular_table_name %>
44
48
  @<%= singular_table_name %> = <%= orm_class.find(class_name, "params[:id]") %>
45
49
  end
46
- <%- if strong_parameters_defined? -%>
47
50
 
48
51
  def <%= "#{singular_table_name}_params" %>
49
52
  <%- if attributes_names.empty? -%>
@@ -52,6 +55,5 @@ class <%= controller_class_name %>Controller < ApplicationController
52
55
  params.require(:<%= singular_table_name %>).permit(<%= attributes_names.map { |name| ":#{name}" }.join(', ') %>)
53
56
  <%- end -%>
54
57
  end
55
- <%- end -%>
56
58
  end
57
59
  <% end -%>
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
4
  module Generators
3
5
  class InstallGenerator < Rails::Generators::Base
@@ -18,6 +20,14 @@ end
18
20
  RUBY
19
21
  end
20
22
 
23
+ def update_application
24
+ inject_into_class "config/application.rb", "Application", <<-RUBY
25
+ # Use the responders controller from the responders gem
26
+ config.app_generators.scaffold_controller :responders_controller
27
+
28
+ RUBY
29
+ end
30
+
21
31
  def update_application_controller
22
32
  prepend_file "app/controllers/application_controller.rb", %{require "application_responder"\n\n}
23
33
  inject_into_class "app/controllers/application_controller.rb", "ApplicationController", <<-RUBY
data/lib/responders.rb CHANGED
@@ -1,33 +1,29 @@
1
- require 'action_controller'
2
- require 'rails/railtie'
1
+ # frozen_string_literal: true
2
+
3
+ require "action_controller"
4
+ require "rails/railtie"
3
5
 
4
6
  module ActionController
5
- autoload :Responder, 'action_controller/responder'
6
- autoload :RespondWith, 'action_controller/respond_with'
7
+ autoload :Responder, "action_controller/responder"
8
+ autoload :RespondWith, "action_controller/respond_with"
7
9
  end
8
10
 
9
11
  module Responders
10
- autoload :FlashResponder, 'responders/flash_responder'
11
- autoload :HttpCacheResponder, 'responders/http_cache_responder'
12
- autoload :CollectionResponder, 'responders/collection_responder'
13
- autoload :LocationResponder, 'responders/location_responder'
12
+ autoload :FlashResponder, "responders/flash_responder"
13
+ autoload :HttpCacheResponder, "responders/http_cache_responder"
14
+ autoload :CollectionResponder, "responders/collection_responder"
15
+ autoload :LocationResponder, "responders/location_responder"
14
16
 
15
- require 'responders/controller_method'
17
+ require "responders/controller_method"
16
18
 
17
19
  class Railtie < ::Rails::Railtie
18
20
  config.responders = ActiveSupport::OrderedOptions.new
19
21
  config.responders.flash_keys = [:notice, :alert]
20
22
  config.responders.namespace_lookup = false
21
23
 
22
- if config.respond_to?(:app_generators)
23
- config.app_generators.scaffold_controller = :responders_controller
24
- else
25
- config.generators.scaffold_controller = :responders_controller
26
- end
27
-
28
24
  # Add load paths straight to I18n, so engines and application can overwrite it.
29
- require 'active_support/i18n'
30
- I18n.load_path << File.expand_path('../responders/locales/en.yml', __FILE__)
25
+ require "active_support/i18n"
26
+ I18n.load_path << File.expand_path("../responders/locales/en.yml", __FILE__)
31
27
 
32
28
  initializer "responders.flash_responder" do |app|
33
29
  Responders::FlashResponder.flash_keys = app.config.responders.flash_keys
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
4
  # This responder modifies your current responder to redirect
3
5
  # to the collection page on POST/PUT/DELETE.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
4
  module ControllerMethod
3
5
  # Adds the given responders to the current controller's responder, allowing you to cherry-pick
@@ -18,7 +20,8 @@ module Responders
18
20
  #
19
21
  def responders(*responders)
20
22
  self.responder = responders.inject(Class.new(responder)) do |klass, responder|
21
- responder = case responder
23
+ responder = \
24
+ case responder
22
25
  when Module
23
26
  responder
24
27
  when String, Symbol
@@ -34,4 +37,6 @@ module Responders
34
37
  end
35
38
  end
36
39
 
37
- ActionController::Base.extend Responders::ControllerMethod
40
+ ActiveSupport.on_load(:action_controller) do
41
+ ActionController::Base.extend Responders::ControllerMethod
42
+ end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
4
  # Responder to automatically set flash messages based on I18n API. It checks for
3
5
  # message based on the current action, but also allows defaults to be set, using
@@ -33,9 +35,9 @@ module Responders
33
35
  # notice: "Hooray! You just tuned your %{car_brand}!"
34
36
  #
35
37
  # Since :car_name is not available for interpolation by default, you have
36
- # to overwrite interpolation_options in your controller.
38
+ # to overwrite `flash_interpolation_options` in your controller.
37
39
  #
38
- # def interpolation_options
40
+ # def flash_interpolation_options
39
41
  # { :car_brand => @car.brand }
40
42
  # end
41
43
  #
@@ -94,7 +96,7 @@ module Responders
94
96
  ActionView::Helpers::TagHelper
95
97
  )
96
98
 
97
- def initialize(controller, resources, options={})
99
+ def initialize(controller, resources, options = {})
98
100
  super
99
101
  @flash = options.delete(:flash)
100
102
  @notice = options.delete(:notice)
@@ -126,7 +128,7 @@ module Responders
126
128
  return if controller.flash[status].present?
127
129
 
128
130
  options = mount_i18n_options(status)
129
- message = Responders::FlashResponder.helper.t options[:default].shift, options
131
+ message = Responders::FlashResponder.helper.t options[:default].shift, **options
130
132
  set_flash(status, message)
131
133
  end
132
134
 
@@ -147,34 +149,46 @@ module Responders
147
149
  end
148
150
 
149
151
  def mount_i18n_options(status) #:nodoc:
150
- resource_name = if resource.class.respond_to?(:model_name)
151
- resource.class.model_name.human
152
- else
153
- resource.class.name.underscore.humanize
154
- end
155
-
156
152
  options = {
157
- :default => flash_defaults_by_namespace(status),
158
- :resource_name => resource_name,
159
- :downcase_resource_name => resource_name.downcase
153
+ default: flash_defaults_by_namespace(status),
154
+ resource_name: resource_name,
155
+ downcase_resource_name: resource_name.downcase
160
156
  }
161
157
 
162
- if controller.respond_to?(:interpolation_options, true)
163
- options.merge!(controller.send(:interpolation_options))
158
+ controller_options = controller_interpolation_options
159
+ if controller_options
160
+ options.merge!(controller_options)
164
161
  end
165
162
 
166
163
  options
167
164
  end
168
165
 
166
+ def controller_interpolation_options
167
+ if controller.respond_to?(:flash_interpolation_options, true)
168
+ controller.send(:flash_interpolation_options)
169
+ elsif controller.respond_to?(:interpolation_options, true)
170
+ ActiveSupport::Deprecation.warn("[responders] `#{controller.class}#interpolation_options` is deprecated, please rename it to `flash_interpolation_options`.")
171
+ controller.send(:interpolation_options)
172
+ end
173
+ end
174
+
175
+ def resource_name
176
+ if resource.class.respond_to?(:model_name)
177
+ resource.class.model_name.human
178
+ else
179
+ resource.class.name.underscore.humanize
180
+ end
181
+ end
182
+
169
183
  def flash_defaults_by_namespace(status) #:nodoc:
170
184
  defaults = []
171
- slices = controller.controller_path.split('/')
185
+ slices = controller.controller_path.split("/")
172
186
  lookup = Responders::FlashResponder.namespace_lookup
173
187
 
174
188
  begin
175
- controller_scope = :"flash.#{slices.fill(controller.controller_name, -1).join('.')}.#{controller.action_name}.#{status}"
189
+ controller_scope = :"flash.#{slices.fill(controller.controller_name, -1).join(".")}.#{controller.action_name}.#{status}"
176
190
 
177
- actions_scope = lookup ? slices.fill('actions', -1).join('.') : :actions
191
+ actions_scope = lookup ? slices.fill("actions", -1).join(".") : :actions
178
192
  actions_scope = :"flash.#{actions_scope}.#{controller.action_name}.#{status}"
179
193
 
180
194
  defaults << :"#{controller_scope}_html"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
4
  # Set HTTP Last-Modified headers based on the given resource. It's used only
3
5
  # on API behavior (to_format) and is useful for a client to check in the server
@@ -9,7 +11,7 @@ module Responders
9
11
  # the digest of the body.
10
12
  #
11
13
  module HttpCacheResponder
12
- def initialize(controller, resources, options={})
14
+ def initialize(controller, resources, options = {})
13
15
  super
14
16
  @http_cache = options.delete(:http_cache)
15
17
  end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
4
  module LocationResponder
3
5
  def self.included(_base)
4
- ActiveSupport::Deprecation.warn "Responders::LocationResponder is enabled by default, "
6
+ ActiveSupport::Deprecation.warn "Responders::LocationResponder is enabled by default, " \
5
7
  "no need to include it", caller
6
8
  end
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Responders
2
- VERSION = "2.0.2".freeze
4
+ VERSION = "3.0.1"
3
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: responders
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.2
4
+ version: 3.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - José Valim
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-07 00:00:00.000000000 Z
11
+ date: 2020-05-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -16,22 +16,30 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 4.2.0.alpha
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '5'
19
+ version: '5.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
- version: 4.2.0.alpha
30
- - - "<"
26
+ version: '5.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: actionpack
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
31
39
  - !ruby/object:Gem::Version
32
- version: '5'
40
+ version: '5.0'
33
41
  description: A set of Rails responders to dry up your application
34
- email: contact@plataformatec.com.br
42
+ email: heartcombo@googlegroups.com
35
43
  executables: []
36
44
  extensions: []
37
45
  extra_rdoc_files: []
@@ -43,7 +51,8 @@ files:
43
51
  - lib/action_controller/responder.rb
44
52
  - lib/generators/rails/USAGE
45
53
  - lib/generators/rails/responders_controller_generator.rb
46
- - lib/generators/rails/templates/controller.rb
54
+ - lib/generators/rails/templates/api_controller.rb.tt
55
+ - lib/generators/rails/templates/controller.rb.tt
47
56
  - lib/generators/responders/install_generator.rb
48
57
  - lib/responders.rb
49
58
  - lib/responders/collection_responder.rb
@@ -53,7 +62,7 @@ files:
53
62
  - lib/responders/locales/en.yml
54
63
  - lib/responders/location_responder.rb
55
64
  - lib/responders/version.rb
56
- homepage: http://github.com/plataformatec/responders
65
+ homepage: https://github.com/heartcombo/responders
57
66
  licenses:
58
67
  - MIT
59
68
  metadata: {}
@@ -65,15 +74,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
65
74
  requirements:
66
75
  - - ">="
67
76
  - !ruby/object:Gem::Version
68
- version: '0'
77
+ version: 2.4.0
69
78
  required_rubygems_version: !ruby/object:Gem::Requirement
70
79
  requirements:
71
80
  - - ">="
72
81
  - !ruby/object:Gem::Version
73
82
  version: '0'
74
83
  requirements: []
75
- rubyforge_project: responders
76
- rubygems_version: 2.2.2
84
+ rubygems_version: 3.1.2
77
85
  signing_key:
78
86
  specification_version: 4
79
87
  summary: A set of Rails responders to dry up your application