restful_json 4.3.1 → 4.4.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
  SHA1:
3
- metadata.gz: f05edb16346a80a688564ca06a5463d3b4739b48
4
- data.tar.gz: 71f4b6e1770c4e026c2f5f9be6dedd62485d7fa3
3
+ metadata.gz: 939e484c768821d49878165026195240c627d440
4
+ data.tar.gz: 43e95c66ab6f95d36d9872639018d1f61a34cd2a
5
5
  SHA512:
6
- metadata.gz: 03ead94cce9a811f74feeddd61bca48361769aae629748cf9ddd9ba0fa3e2e60791fb87b9db8f73080175680879f4da76a2dac3acf84046a833cf5b046819a66
7
- data.tar.gz: d0feaec66ab9ccf77953468e33f28b888280fd4dcde651f3168a1e7e916edaf928e2decacd513f1348e03ed3f53b169d0def3efd2b92a7b148df5e939fd0ea05
6
+ metadata.gz: 0197b80bb543238b5c7c702ea467b9098cd1a3345041d755f02697213e125e13caf061e2c0e57b99039caa7319a52dba367754d7c62936d3f95a6513877ba381
7
+ data.tar.gz: 3081b689fd3ae24b4e0b9a27ca46cee918d766ec59a29f1161b32594b4499919e279570f8080f656bb2833bfaf61380f24cd88dea5515d6e153ba90de993eb69
data/README.md CHANGED
@@ -108,38 +108,44 @@ Be sure to read the [Strong Parameters][strong_parameters] docs, because you nee
108
108
  As noted in [Strong Parameters][strong_parameters], it is suggested to encapsulate the permitting into a private method in the controller, so we allow:
109
109
 
110
110
  ```ruby
111
- def foobar_params
112
- params.require(:foobar).permit(:name, :age)
113
- end
111
+ private
112
+
113
+ def foobar_params
114
+ params.require(:foobar).permit(:name, :age)
115
+ end
114
116
  ```
115
117
 
116
118
  or if `self.allow_action_specific_params_methods = true` is set in restful_json configuration, as it is by default:
117
119
 
118
120
  ```ruby
119
- def create_foobar_params
120
- params.require(:foobar).permit(:name, :age)
121
- end
121
+ private
122
122
 
123
- def update_foobar_params
124
- params.require(:foobar).permit(:age)
125
- end
123
+ def create_foobar_params
124
+ params.require(:foobar).permit(:name, :age)
125
+ end
126
+
127
+ def update_foobar_params
128
+ params.require(:foobar).permit(:age)
129
+ end
126
130
  ```
127
131
 
128
- and even other actions if you want:
132
+ and even other actions, if needed:
129
133
 
130
134
  ```ruby
131
- def index_foobars_params
132
- params.require(:foobars).permit(:foo_id)
133
- end
135
+ private
134
136
 
135
- # where 'some_action' is a custom action created by query_for
136
- def some_action_foobars_params
137
- params.require(:foobars).permit(:foo_id)
138
- end
137
+ def index_foobars_params
138
+ params.require(:foobars).permit(:foo_id)
139
+ end
139
140
 
140
- def show_foobar_params
141
- params.require(:foobar).permit(:id)
142
- end
141
+ # where 'some_action' is a custom action created by query_for
142
+ def some_action_foobars_params
143
+ params.require(:foobars).permit(:foo_id)
144
+ end
145
+
146
+ def show_foobar_params
147
+ params.require(:foobar).permit(:id)
148
+ end
143
149
  ```
144
150
 
145
151
  ##### Permitters
@@ -714,12 +720,9 @@ By convention, a restful_json controller can call the `(singular model name)_par
714
720
  ```ruby
715
721
  self.actions_supporting_params_methods = [:create, :update]
716
722
  ```
723
+ e.g., starting in restful_json v4.4, in FoobarsController after any other specifics, it would look for a foobar_params method in your controller, and if it is there, it will call it, expecting it to permit params. But, if you change the value of `self.actions_supporting_params_methods` in restful_json config or controller config, it will use whatever you specified.
717
724
 
718
- And by default restful_json allows action specific `(action)_(model)_params` methods, so you only need to define a method like `create_foobar_params` and it will try to call that on create:
719
-
720
- ```ruby
721
- self.allow_action_specific_params_methods = true
722
- ```
725
+ Also, if you have a method like `create_foobar_params`, and it will try to call that on create (and similar for `update_foobar_params` and update).
723
726
 
724
727
  ##### Avoid n+1 Queries
725
728
 
@@ -912,13 +915,37 @@ For more realistic use that takes advantage of existing configuration in the con
912
915
 
913
916
  ### Error Handling
914
917
 
915
- #### Properly Handling Non-controller-action Errors
918
+ #### Validation Errors
916
919
 
917
- Some things restful_json can't do in the controller, like responding with json for a json request when the route is not setup correctly or an action is missing.
920
+ Validation errors (for validations you put in your models) are handled in the controller and returned as an error response in JSON.
921
+
922
+ #### RecordNotFound and Other Non-validation Errors
923
+
924
+ ##### Rails 4 Default Rack Error Handling
918
925
 
919
926
  Rails 4 has basic error handling for non-HTML formats defined in the [public_exceptions][public_exceptions] and [show_exceptions][show_exceptions] Rack middleware.
920
927
 
921
- Rails 3.2.x has support for `config.exceptions_app` which can be defined as the following to simulate Rails 4 exception handling:
928
+ To use the Rails 4 default Rack error handling, you need to remove all of the default configuration for rescue handlers in restful_json via:
929
+
930
+ ```ruby
931
+ RestfulJson.configure do
932
+ self.rescue_handlers = []
933
+ end
934
+ ```
935
+
936
+ If you don't want to handle it the way Rack does by default, read on...
937
+
938
+ #### Rails 3.2.x+ Rack Exceptions App Customization
939
+
940
+ First, ensure that you've unset restful_json's rescue_handlers to use the Rails 3.2+ Rack error handling:
941
+
942
+ ```ruby
943
+ RestfulJson.configure do
944
+ self.rescue_handlers = []
945
+ end
946
+ ```
947
+
948
+ Rails 3.2.x has support for `config.exceptions_app` which can be defined as the following in your Rails app configuration to simulate Rails 4 exception handling, or if you want to customize Rails 4's Rack exception handling:
922
949
 
923
950
  ```ruby
924
951
  config.exceptions_app = lambda do |env|
@@ -953,17 +980,11 @@ Unfortunately, this doesn't work for Rails 3.1.x. However, in many scenarios the
953
980
 
954
981
  But, if you can make Rack respond a little better for some errors, that's great.
955
982
 
956
- To let all errors and exceptions fall out of restful_json action methods so that they will all be handled (without `error_data` in response) in the same way as routing, missing action, and other errors caught by Rack, just use:
983
+ #### The Default Way Non-validation Errors Are Handled
957
984
 
958
- ```ruby
959
- RestfulJson.configure do
960
- self.rescue_handlers = []
961
- end
962
- ```
963
-
964
- #### Controller Error-handling Configuration
985
+ The default configuration will use a configuration to use rescue_handlers which is just a way to configure how the controller's action methods rescue non-validation errors to render a response.
965
986
 
966
- The default configuration will rescue StandardError in each action method and will render as 404 for ActiveRecord::RecordNotFound or 500 for all other StandardError (and ancestors, like a normal rescue).
987
+ The standard configuration will rescue StandardError in each action method and will render as 404 for ActiveRecord::RecordNotFound or 500 for all other StandardError (and ancestors, like a normal rescue).
967
988
 
968
989
  There are a few options to customize the rescue and error rendering behavior.
969
990
 
@@ -993,13 +1014,17 @@ RestfulJson.configure do
993
1014
  end
994
1015
  ```
995
1016
 
996
- The `return_error_data` config option will not only return a response with `status` and `error` but also an `error_data` containing the `e.class.name`, `e.message`, and cleaned `e.backtrace`.
1017
+ The `return_error_data` restful_json config option (true by default) will not only return a response with `status` and `error` but also an `error_data` containing the `e.class.name`, `e.message`, and cleaned `e.backtrace`.
997
1018
 
998
- If you want to rescue using `rescue_from` in a controller or ApplicationController, let all errors and exceptions fall out of restful_json action methods with:
1019
+ You can turn off backtrace cleaning in `error_data` by setting `clean_backtrace` per handler to false, e.g.:
999
1020
 
1000
1021
  ```ruby
1001
1022
  RestfulJson.configure do
1002
- self.rescue_handlers = []
1023
+ self.rescue_class = Exception
1024
+ self.rescue_handlers = [
1025
+ {exception_ancestor_classes: [ActiveRecord::RecordNotFound], status: :not_found, i18n_key: 'api.not_found'.freeze},
1026
+ {i18n_key: 'api.internal_server_error'.freeze, clean_backtrace: false}
1027
+ ]
1003
1028
  end
1004
1029
  ```
1005
1030
 
@@ -83,6 +83,9 @@ RestfulJson.configure do
83
83
 
84
84
  # will define order of errors handled and what status and/or i18n message key to use
85
85
  self.rescue_handlers = []
86
+
87
+ # default to checking for the StrongParameters default method (singular model name)_params and using it if haven't tried
88
+ self.actions_supporting_params_methods = [:create, :update]
86
89
 
87
90
  # rescue_handlers are an ordered array of handlers to handle rescue of self.rescue_class or sub types.
88
91
  # can use optional i18n_key for message, but will default to e.message if i18n_key not found.
@@ -52,6 +52,7 @@ module RestfulJson
52
52
  self.param_to_through ||= {}
53
53
  self.action_to_render_options ||= {}
54
54
  self.action_to_query_includes ||= {}
55
+ self.actions_supporting_params_methods ||= []
55
56
  end
56
57
 
57
58
  module ClassMethods
@@ -308,7 +309,7 @@ module RestfulJson
308
309
 
309
310
  def apply_includes(value)
310
311
  this_includes = current_action_includes
311
- if this_includes
312
+ if this_includes && this_includes.size > 0
312
313
  value = value.includes(*this_includes)
313
314
  end
314
315
  value
@@ -327,10 +328,14 @@ module RestfulJson
327
328
  if self.actions_that_permit.include?(action_sym)
328
329
  if self.use_permitters
329
330
  return permitted_params_using(self.action_to_permitter[action_sym] || permitter_class)
330
- elsif self.allow_action_specific_params_methods && respond_to?(action_specific_params_method)
331
+ elsif self.allow_action_specific_params_methods && self.respond_to?(action_specific_params_method, true)
331
332
  return __send__(action_specific_params_method)
332
- elsif self.actions_supporting_params_methods.include?(action_sym) && respond_to?(model_name_params_method)
333
- return __send__(model_name_params_method)
333
+ elsif self.actions_supporting_params_methods.include?(action_sym)
334
+ if self.respond_to?(model_name_params_method, true)
335
+ return __send__(model_name_params_method)
336
+ elsif defined?(::ActionController::StrongParameters)
337
+ raise "#{self.class.name} needs a method (can be private): #{model_name_params_method}#{self.allow_action_specific_params_methods ? " or #{action_specific_params_method}" : ''}"
338
+ end
334
339
  end
335
340
  end
336
341
 
@@ -350,6 +355,7 @@ module RestfulJson
350
355
  #
351
356
  # It handles any format in theory that is supported by respond_to and has a `to_(some format)` method.
352
357
  def render_error(e, handling_data)
358
+ use_backtrace_cleaner = handling_data[:clean_backtrace] || true
353
359
  i18n_key = handling_data[:i18n_key]
354
360
  msg = t(i18n_key, default: e.message)
355
361
  status = handling_data[:status] || :internal_server_error
@@ -1,3 +1,3 @@
1
1
  module RestfulJson
2
- VERSION = '4.3.1'
2
+ VERSION = '4.4.0'
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: restful_json
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.3.1
4
+ version: 4.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gary S. Weaver
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-08-05 00:00:00.000000000 Z
12
+ date: 2013-08-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport