exception_handler 0.7.6.0 → 0.7.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (94) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +40 -33
  3. data/.slugignore +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +13 -13
  6. data/README.md +436 -436
  7. data/Rakefile +7 -7
  8. data/app/assets/stylesheets/exception_handler.css.erb +18 -18
  9. data/app/assets/stylesheets/styles/_base.css.erb +35 -35
  10. data/app/assets/stylesheets/styles/_exception.css.erb +105 -105
  11. data/app/assets/stylesheets/styles/_footer.css.erb +24 -24
  12. data/app/assets/stylesheets/styles/_responsive.css +5 -5
  13. data/app/controllers/exception_handler/exceptions_controller.rb +59 -59
  14. data/app/mailers/exception_handler/exception_mailer.rb +17 -17
  15. data/app/models/exception_handler/exception.rb +199 -191
  16. data/app/views/exception_handler/exceptions/show.html.erb +3 -3
  17. data/app/views/exception_handler/mailers/layout.haml +8 -8
  18. data/app/views/exception_handler/mailers/layout.text.erb +1 -1
  19. data/app/views/exception_handler/mailers/new_exception.erb +4 -4
  20. data/app/views/layouts/exception.html.erb +27 -27
  21. data/config/locales/exception_handler.en.yml +28 -28
  22. data/db/migrate/000000_create_errors.rb +34 -34
  23. data/exception_handler.gemspec +62 -80
  24. data/lib/exception_handler.rb +55 -45
  25. data/lib/exception_handler/config.rb +116 -104
  26. data/lib/exception_handler/engine.rb +70 -61
  27. data/lib/exception_handler/version.rb +25 -0
  28. data/lib/generators/exception_handler/views_generator.rb +33 -33
  29. metadata +7 -71
  30. data/.gitattributes +0 -1
  31. data/.rspec +0 -4
  32. data/LICENSE.txt +0 -22
  33. data/spec/database.yml +0 -3
  34. data/spec/dummy/Rakefile +0 -6
  35. data/spec/dummy/app/assets/config/manifest.js +0 -4
  36. data/spec/dummy/app/assets/images/.keep +0 -0
  37. data/spec/dummy/app/assets/javascripts/application.js +0 -13
  38. data/spec/dummy/app/assets/javascripts/cable.coffee +0 -11
  39. data/spec/dummy/app/assets/javascripts/channels/.keep +0 -0
  40. data/spec/dummy/app/assets/stylesheets/application.css +0 -15
  41. data/spec/dummy/app/channels/application_cable/channel.rb +0 -5
  42. data/spec/dummy/app/channels/application_cable/connection.rb +0 -5
  43. data/spec/dummy/app/controllers/application_controller.rb +0 -5
  44. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  45. data/spec/dummy/app/helpers/application_helper.rb +0 -2
  46. data/spec/dummy/app/jobs/application_job.rb +0 -2
  47. data/spec/dummy/app/mailers/application_mailer.rb +0 -4
  48. data/spec/dummy/app/models/application_record.rb +0 -3
  49. data/spec/dummy/app/models/concerns/.keep +0 -0
  50. data/spec/dummy/app/views/layouts/application.html.erb +0 -15
  51. data/spec/dummy/app/views/layouts/mailer.html.erb +0 -13
  52. data/spec/dummy/app/views/layouts/mailer.text.erb +0 -1
  53. data/spec/dummy/bin/bundle +0 -3
  54. data/spec/dummy/bin/rails +0 -4
  55. data/spec/dummy/bin/rake +0 -4
  56. data/spec/dummy/bin/setup +0 -34
  57. data/spec/dummy/bin/update +0 -29
  58. data/spec/dummy/config.ru +0 -8
  59. data/spec/dummy/config/application.rb +0 -21
  60. data/spec/dummy/config/boot.rb +0 -5
  61. data/spec/dummy/config/cable.yml +0 -10
  62. data/spec/dummy/config/database.yml +0 -25
  63. data/spec/dummy/config/environment.rb +0 -5
  64. data/spec/dummy/config/environments/development.rb +0 -62
  65. data/spec/dummy/config/environments/production.rb +0 -87
  66. data/spec/dummy/config/environments/test.rb +0 -42
  67. data/spec/dummy/config/initializers/active_record_belongs_to_required_by_default.rb +0 -6
  68. data/spec/dummy/config/initializers/application_controller_renderer.rb +0 -6
  69. data/spec/dummy/config/initializers/assets.rb +0 -11
  70. data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
  71. data/spec/dummy/config/initializers/callback_terminator.rb +0 -6
  72. data/spec/dummy/config/initializers/cookies_serializer.rb +0 -5
  73. data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
  74. data/spec/dummy/config/initializers/inflections.rb +0 -16
  75. data/spec/dummy/config/initializers/mime_types.rb +0 -4
  76. data/spec/dummy/config/initializers/per_form_csrf_tokens.rb +0 -4
  77. data/spec/dummy/config/initializers/request_forgery_protection.rb +0 -4
  78. data/spec/dummy/config/initializers/session_store.rb +0 -3
  79. data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
  80. data/spec/dummy/config/locales/en.yml +0 -23
  81. data/spec/dummy/config/puma.rb +0 -47
  82. data/spec/dummy/config/routes.rb +0 -6
  83. data/spec/dummy/config/secrets.yml +0 -22
  84. data/spec/dummy/lib/assets/.keep +0 -0
  85. data/spec/dummy/log/.keep +0 -0
  86. data/spec/dummy/public/404.html +0 -67
  87. data/spec/dummy/public/422.html +0 -67
  88. data/spec/dummy/public/500.html +0 -66
  89. data/spec/dummy/public/apple-touch-icon-precomposed.png +0 -0
  90. data/spec/dummy/public/apple-touch-icon.png +0 -0
  91. data/spec/dummy/public/favicon.ico +0 -0
  92. data/spec/exception_handler.rb +0 -22
  93. data/spec/exception_handler/exception_controller_spec.rb +0 -18
  94. data/spec/spec_helper.rb +0 -55
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d28c52523ca9addb4bcd97c3d1176addb96f0a5d
4
- data.tar.gz: 526c789221dbdb9a5a411f52339967e34a00c1d3
3
+ metadata.gz: 148c46f79b5ee16ca3c48ec3e9bffc41624ec964
4
+ data.tar.gz: 25c4c163fbbf6fbc0e11622150b9384f853f3c23
5
5
  SHA512:
6
- metadata.gz: d807d1da0d8d10b9b930004b5cd0cf0a91d32c3f3fe64da5366dae425f4154c1cdb3a2bd825ec8c1ff64c464542e5761d0ef3154507769d8024b2e6bd3b9cf5f
7
- data.tar.gz: 2fbb8224f4bf5eac7de20c6071c80d7b9c011b85cb68b9f790c1932ba037f8f2e657272909e79f281ad2401bf8bfda30f6c90500b6cafe14deb5d7cba5ee297e
6
+ metadata.gz: 592424a51d78607fd8ca707e573f98fe5586ea55920ca39fcc598228cece073f2c25002dd57ee09b17233096a78bde8ece09f165309d99d071c44e8dc654a6d7
7
+ data.tar.gz: d65c120bf893e025fa1f68808a2feb1d403b7f3e036088e0ebb253008c67861f4e50f5e24ac12b3bd812e910cb113ec4b1cf37ae9af52ff9285196e5937a373f
data/.gitignore CHANGED
@@ -1,33 +1,40 @@
1
- *.gem
2
- *.rbc
3
- .bundle
4
- .config
5
- .yardoc
6
- Gemfile.lock
7
- InstalledFiles
8
- _yardoc
9
- coverage
10
- doc/
11
- lib/bundler/man
12
- pkg
13
- rdoc
14
- spec/reports
15
- test/tmp
16
- test/version_tmp
17
- tmp
18
- *.bundle
19
- *.so
20
- *.o
21
- *.a
22
- mkmf.log
23
- *.tmp
24
-
25
- # http://stackoverflow.com/questions/8865848/comments-in-gitignore
26
- # https://gist.github.com/danielpcox/4636520
27
-
28
- log/*.log
29
- pkg/
30
- spec/dummy/db/*.sqlite3
31
- spec/dummy/log/*.log
32
- spec/dummy/tmp/
33
- spec/dummy/.sass-cache
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ *.tmp
24
+
25
+ # Desktop INI (Windows)
26
+ desktop.ini
27
+
28
+ # Git BFG
29
+ .git.bfg-report
30
+ .git.bfg-report/2017-06-29/07-53-00
31
+
32
+ # http://stackoverflow.com/questions/8865848/comments-in-gitignore
33
+ # https://gist.github.com/danielpcox/4636520
34
+
35
+ log/*.log
36
+ pkg/
37
+ spec/dummy/db/*.sqlite3
38
+ spec/dummy/log/*.log
39
+ spec/dummy/tmp/
40
+ spec/dummy/.sass-cache
@@ -1,7 +1,7 @@
1
- # Ignore art files
2
- # https://devcenter.heroku.com/articles/slug-compiler#ignoring-files-with-slugignore
3
- *.psd
4
- *.pdf
5
- /test
6
- /spec
7
- /readme
1
+ # Ignore art files
2
+ # https://devcenter.heroku.com/articles/slug-compiler#ignoring-files-with-slugignore
3
+ *.psd
4
+ *.pdf
5
+ /test
6
+ /spec
7
+ /readme
@@ -1,5 +1,5 @@
1
- rvm:
2
- - 2.2.4
3
- - 2.3.2
4
- - 2.4.0
5
- - ruby-head
1
+ rvm:
2
+ - 2.2.4
3
+ - 2.3.2
4
+ - 2.4.0
5
+ - ruby-head
data/Gemfile CHANGED
@@ -1,13 +1,13 @@
1
- source 'https://rubygems.org'
2
-
3
- # Specify your gem's dependencies in custom_error_pages.gemspec
4
- gemspec
5
-
6
- ###########################################
7
-
8
- #For Testing
9
- group :test do
10
- gem 'coveralls', require: false
11
- end
12
-
13
- ###########################################
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in custom_error_pages.gemspec
4
+ gemspec
5
+
6
+ ###########################################
7
+
8
+ #For Testing
9
+ group :test do
10
+ gem 'coveralls', require: false
11
+ end
12
+
13
+ ###########################################
data/README.md CHANGED
@@ -1,436 +1,436 @@
1
- ![Exception Handler](readme/title.jpg "Exception Handler Logo")
2
-
3
- <p align="center">
4
- <font size="4"><strong>Custom 404 & 500 production error pages for Rails 4 & 5.</font></strong>
5
- </p>
6
-
7
- <p align="center">
8
- <a href="http://badge.fury.io/rb/exception_handler"><img src="https://badge.fury.io/rb/exception_handler.svg" align="absmiddle"></a>
9
- <a href="http://rubygems.org/gems/exception_handler"><img src="http://ruby-gem-downloads-badge.herokuapp.com/exception_handler/0.5.1?type=total&color=brightgreen" align="absmiddle" /></a>
10
- <a href="https://codeclimate.com/github/richpeck/exception_handler"><img src="https://codeclimate.com/github/richpeck/exception_handler/badges/gpa.svg" align="absmiddle"/></a>
11
- <a href="https://gemnasium.com/richpeck/exception_handler"><img src="https://gemnasium.com/richpeck/exception_handler.svg" align="absmiddle"></a>
12
- <a href='https://coveralls.io/github/richpeck/exception_handler?branch=master'><img src='https://coveralls.io/repos/github/richpeck/exception_handler/badge.svg?branch=master' alt='Coverage Status' align="absmiddle" /></a>
13
- <a href="https://travis-ci.org/richpeck/exception_handler"><img src="https://travis-ci.org/richpeck/exception_handler.svg?branch=master" align="absmiddle"></a>
14
- </p>
15
-
16
- <p align="center">
17
- <strong><a href="#install">Install</a></strong> → <strong><a href="#config">Setup</a></strong> → <strong><a href="#support">Support</a></strong>
18
- </p>
19
-
20
- ---
21
-
22
- <p align="center">
23
- <img src="readme/version.jpg" /><br/>
24
- </p>
25
-
26
- <p align="center">
27
- <img src="readme/check.png" height="22" title="Fully Responsive" align="absmiddle" />&nbsp; <strong>Responsive</strong> &nbsp;
28
- <img src="readme/check.png" height="22" title="Branded Error Pages" align="absmiddle" />&nbsp; <strong>Branded Error Pages</strong> &nbsp;
29
- <img src="readme/check.png" height="22" title="Middleware Exception Handling" align="absmiddle" />&nbsp; <strong>Middleware Exception Handling</strong> &nbsp;
30
- <img src="readme/check.png" height="22" title="Keep Users Informed" align="absmiddle" />&nbsp; <strong>Fully Customizable</strong> &nbsp;
31
- </p>
32
-
33
- <p align="center">
34
- <img src="readme/branded/1.jpg" width="425" title="Fully Branded Error Pages" /> <img src="readme/branded/2.jpg" width="425" title="Fully Branded Error Pages" />
35
- <img src="readme/branded/3.jpg" width="425" title="Fully Branded Error Pages" /> <img src="readme/branded/4.jpg" width="425" title="Fully Branded Error Pages" />
36
- </p>
37
-
38
- ---
39
-
40
- <p align="center">
41
- <img src="readme/rails.jpg" title="Version 0.7.5 Released Early 2017" />
42
- </p>
43
-
44
- ---
45
-
46
- <p align="center">
47
- <img src="readme/titles/rails5.png" title="Fully Rails 5 Compatible" width="625" />
48
- </p>
49
-
50
- <p align="center">
51
- <img src="readme/check_02.png" height="22" title="New Controller" align="absmiddle" />&nbsp; <strong align="absmiddle">New Controller</strong> &nbsp;
52
- <img src="readme/check_02.png" height="22" title="New Middleware" align="absmiddle" />&nbsp; <strong align="absmiddle">New Middleware</strong> &nbsp;
53
- <img src="readme/check_02.png" height="22" title="Full Test Suite" align="absmiddle" />&nbsp; <strong align="absmiddle">Full Test Suite</strong> &nbsp;
54
- <img src="readme/check_02.png" height="22" title="Rails 4 & 5 Compatible" align="absmiddle" />&nbsp; <strong align="absmiddle">Fully Rails 4 & 5 Compatible</strong> &nbsp;
55
- </p>
56
-
57
- Brand new `controller` & `middleware` have made **`ExceptionHandler`** even more powerful & efficient. Now you can use `ExceptionHandler` with a [single click](#install) → **plug and play** custom exception pages:
58
-
59
- <p align="center">
60
- <br />
61
- <img src="readme/400.png" title="400 Errors" width="430" />
62
- <img src="readme/500.png" title="500 Errors" width="430" />
63
- </p>
64
-
65
- <p align="center">For over 3 years, <strong>ExceptionHandler</strong> has provided production-level <strong>Rails</strong> exception handling for <strong>4xx</strong> and <strong>5xx</strong> errors:</p>
66
-
67
- ![HTTP Error Codes][http_codes]
68
-
69
- Since **browsers only read `4xx` & `5xx` error codes**, all Rails exceptions have to be inferred. Thus, `ExceptionHandler` simply has to manage how the `4xx` / `5xx` errors are passed to the browser.
70
-
71
- Unlike other gems, **`ExceptionHandler` uses a custom [`controller`](app/controllers/exception_handler/exceptions_controller.rb) to build an [`@exception`](app/models/exception_handler/exception.rb) object**. This allows us to save the exception, email it or do anything else we may need. The gem has already been a massive success and we continue to actively maintain it.
72
-
73
- Now you can try for yourself ...
74
-
75
-
76
- ----
77
-
78
- <p align="center">
79
- <br />
80
- <img src="readme/titles/middleware.png" title="Middleware-Powered Exceptions" width="400" />
81
- </p>
82
-
83
- The secret lies in [**`config.exceptions_app`**][exception_app] ↴
84
-
85
- > **`config.exceptions_app`** sets the exceptions application invoked by the **`ShowException`** middleware when an exception happens. Defaults to **`ActionDispatch::PublicExceptions.new(Rails.public_path)`**
86
-
87
- ![Exceptions handled by the ActiveDispatch::ShowExceptions Middleware][middleware]
88
-
89
- Each time an exception is raised, [`ShowExceptions`][show_exception] takes the request and forwards it to `config.exceptions_app`. This is expected to return a response - allowing us to inject a [`controller`](app/controllers/exception_handler/exceptions_controller.rb):
90
-
91
- ![config.exceptions_app - The key to all Rails exceptions][exceptions_app]
92
-
93
- Because our callback maintains the request, we are able to do whatever we need before serving a response. This is a **major** advantage over the "default" (routes). The routes invokes Rails twice and does not persist the request.
94
-
95
- **`ExceptionHandler` is the only gem to provide middleware-powered exception handling.** It populates our custom `view` with details, giving us the ability to **maintain branding** when exceptions are raised:
96
-
97
- ![Exceptions handled by the ActiveDispatch::ShowExceptions Middleware][middleware]
98
-
99
- **`ExceptionHandler` is the most EFFECTIVE and EFFICIENT gem to handle exceptions in Rails**.
100
-
101
- Once invoked, its `model`, `controller` and `views` work together to serve the best responses to Rails errors ...
102
-
103
- ----------
104
-
105
- <p align="center" id="install">
106
- <br />
107
- <img src="readme/titles/install.png" title="1 Click Install for ExceptionHandler 0.7.0 on Rails 5" width="400" />
108
- <br />
109
- <strong>Custom Rails Error Pages - ZERO configuration needed:</strong>
110
- <br />
111
- </p>
112
-
113
- <p align="center">
114
- <a href="http://rubygems.org/gems/exception_handler"><img src="readme/gem.jpg" /></a> <a href="http://rubygems.org/gems/exception_handler"><img src="readme/gemfile.jpg" /></a>
115
- </p>
116
-
117
-
118
- <p align="center">
119
- You can install it from the <strong>CLI</strong> or <strong>Gemfile</strong> - it will AUTOMATICALLY run in <strong>production</strong>.
120
- <br />
121
- <strong>↓ To run in development, use <a href="#dev-mode">dev mode</a> ↓</strong>
122
- </p>
123
-
124
- ---
125
-
126
- <p align="center">
127
- If you want to set it up your way, you can use these features...
128
- </p>
129
-
130
- <p align="center">
131
- <a href="#config"><img src="readme/titles/icons/config.png" alt="Cinfiguration Options" align="absmiddle" height="24" /> Config</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#dev-mode" title="Dev Mode"><img src="readme/titles/icons/dev.png" alt="Dev" align="absmiddle" height="24" /> Dev</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#database"><img src="readme/titles/icons/database.png" alt="Database" align="absmiddle" height="24" /> Database</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#email"><img src="readme/titles/icons/email.png" alt="Email" align="absmiddle" height="24" /> Email</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#views"><img src="readme/titles/icons/views.png" alt="Views" align="absmiddle" height="24" /> Views</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#locales"><img src="readme/titles/icons/locales.png" alt="Locales" align="absmiddle" height="20" /> Locales</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#custom-exceptions"><img src="readme/titles/icons/custom.png" alt="Custom Exceptions" align="absmiddle" height="18" /> Custom Exceptions</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#generators"><img src="readme/titles/icons/generators.png" alt="Generators" align="absmiddle" height="24" /> Generators</a>
132
- </p>
133
-
134
- ----
135
-
136
- ## Config
137
-
138
- **From [`0.4.7`](https://github.com/richpeck/exception_handler/releases/tag/0.4.6), `ExceptionHandler` manages its [config](lib/exception_handler/config.rb#L45) from the central Rails `config` hash:**
139
-
140
- [![config][config]](lib/exception_handler/config.rb#L45)
141
-
142
- If you're using an [`engine`](http://guides.rubyonrails.org/engines.html), you don't need to use an `initializer`:
143
-
144
- # lib/engine.rb
145
- module YourModule
146
- class Engine < Rails::Engine
147
-
148
- # => ExceptionHandler
149
- # => Works in and out of an initializer
150
- config.exception_handler = {
151
- dev: false,
152
- db: true
153
- }
154
- end
155
-
156
- end
157
-
158
- You only need to provide the inputs you want, for example:
159
-
160
- # config/application.rb
161
- config.exception_handler = { dev: true }
162
-
163
- # config/environments/production.rb
164
- config.exception_handler = { social: { fusion: "flutils" }}
165
-
166
- ----
167
-
168
- ## Dev Mode
169
-
170
- **To enable `ExceptionHandler` in dev, enable the [`dev`](lib/exception_handler/config.rb#L38) option:**
171
-
172
- ![Dev][dev_mode]
173
-
174
- This disables [`config.consider_all_requests_local`](http://guides.rubyonrails.org/configuring.html#rails-general-configuration), making Rails behave as it would in production:
175
-
176
- ![Dev][dev_img]
177
-
178
- ----
179
-
180
- ## Database
181
-
182
- **We also have `ActiveRecord` integration.**
183
-
184
- If you want to save your exceptions to `db`, you need to enable the `db` config option:
185
-
186
- # config/application.rb
187
- config.exception_handler = {
188
- db: true
189
- }
190
-
191
- This enables `ActiveRecord::Base` on the [`Exception`](app/models/exception_handler/exception.rb) class, allowing us to save to the database.
192
-
193
- In order for this to work, your db needs the correct table.
194
-
195
- To do this, once you've enabled the option, run `rails db:migrate` from your console. Our new [`migration system`](https://github.com/richpeck/exception_handler/tree/readme#migrations) will automatically run the migration.
196
-
197
- ---
198
-
199
- ## Email
200
-
201
- **`ExceptionHandler` also now sends email notifications.**
202
-
203
- If you want to receive emails whenever your application raises an error, you can do so by adding your email to the config:
204
-
205
- # config/application.rb
206
- config.exception_handler = {
207
- email: "your@email.com"
208
- }
209
-
210
- > **Please Note** this requires [`ActionMailer`](http://guides.rubyonrails.org/action_mailer_basics.html). If you don't have any outbound SMTP server, [`SendGrid`](http://sendgrid.com) is free.
211
-
212
- [Full tutorial here](https://github.com/richpeck/exception_handler/wiki/2-Email)
213
-
214
- ---
215
-
216
- ## Views
217
-
218
- **From [`0.7.0`](#070), we overhauled the view system:**
219
-
220
- ![View][view_img]
221
-
222
- [Wiew](app/views/exception_handler/exceptions/show.html.erb) is modular - `@exception` populated with [`locales`](#locales).
223
-
224
- ---
225
-
226
- ## Locales
227
-
228
- **[`0.7.5`](https://github.com/richpeck/exception_handler/releases/tag/0.7.5) introduced [locales](config/locales/exception_handler.yml) ...**
229
-
230
- [[ locales ]]
231
-
232
- The `ExceptionHandler` view is populated by [`@exception.description`](app/models/exception_handler/exception.rb#L121), which pulls from the `locales`.
233
-
234
- If you want custom messages, you need the following. The key is defined by the HTTP [`status_code`](https://github.com/rack/rack/blob/1.5.2/lib/rack/utils.rb#L544)
235
-
236
- # config/locales/en.yml
237
- en:
238
- exception_handler:
239
- not_found: "Your message here"
240
- unauthorized: "You need to login to continue"
241
- internal_server_error: "This is a test to show the %{status} of the error"
242
-
243
- You get access to `%{message}` and `%{status}`, both inferring from `@exception`.
244
-
245
- ---
246
-
247
- ## Layout
248
-
249
- **The `layout` has also been improved ↴**
250
-
251
- ![Layout][layout_img]
252
-
253
- We now assign layouts to the **status code** of the response:
254
-
255
- ![Layout][layouts_img]
256
-
257
- By default, `5xx` errors are shown with our [`exception` layout][layout] - this can be overridden by changing the `config` to use a layout of your choice. If you want to inherit the `ApplicationController` layout, assign the codes to `nil`.
258
-
259
- ---
260
-
261
-
262
- ## Custom Exceptions
263
-
264
- **Custom Exceptions also supported in [`0.7.5`](https://github.com/richpeck/exception_handler/releases/tag/0.7.5)**
265
-
266
- Rails handles this for us - [**`config.action_dispatch.rescue_responses`**][rescue_responses] ↴
267
-
268
- ![ActionDispatch][config.action_dispatch.rescue_responses]
269
-
270
- You need to add to the `rescue_responses` hash in your app's config (mapped to [`status codes`](https://github.com/rack/rack/blob/1.5.2/lib/rack/utils.rb#L544)):
271
-
272
- # config/application.rb
273
- config.action_dispatch.rescue_responses["ActionController::YourError"] = :bad_request
274
-
275
- Because `HTTP` can only process `4xx` / `5xx` errors, if `Rails` raises an exception, it needs to assign one of the error status codes. **Default** is [`internal_server_error`](https://github.com/rack/rack/blob/1.5.2/lib/rack/utils.rb#L595) - if you'd prefer your app to just return `500` errors for your custom exception, you don't need to explicitly declare them.
276
-
277
- ---
278
-
279
- ## Generators
280
-
281
- **You can generate `ExceptionHandler` into your own application.**
282
-
283
- [[ Generator ]]
284
-
285
- The following commands will copy the directories...
286
-
287
- rails g exception_handler:views
288
- rails g exception_handler:views -v views
289
- rails g exception_handler:views -v controllers
290
- rails g exception_handler:views -v models
291
- rails g exception_handler:views -v assets
292
- rails g exception_handler:views -v views controllers models assets
293
-
294
- If you don't include any switches, this will copy **all** the folders put into your app.
295
-
296
- Each switch defines which folders you want (EG `-v views` will only copy `views` dir).
297
-
298
- ---
299
-
300
- ### Migrations (deprecated)
301
-
302
- **From [`0.7.5`](https://github.com/richpeck/exception_handler/releases/tag/0.7.5), the `migration` generator has been removed in favour of our own [migration system](lib/exception_handler/engine.rb#L58)**
303
-
304
- You don't need to generate a migration any more.
305
-
306
- If you set the `db` option in config, run `rails db:migrate` and the migration will be run.
307
-
308
- To rollback, use the following:
309
-
310
- rails db:migrate:down VERSION=000000
311
-
312
- > The drawback to this is that if you remove `ExceptionHandler` before you rollback the migration, it won't exist anymore. You can **only** fire the `rollback` when you have `ExceptionHandler` installed.
313
-
314
- ---
315
-
316
- ## Support
317
-
318
- [Issues](https://github.com/richpeck/exception_handler/issues)
319
-
320
- ---
321
-
322
- ## Changelog
323
-
324
- ### [0.7.5](https://github.com/richpeck/exception_handler/releases/tag/0.7.5)
325
- - [x] [HTTP status layouts](#layouts)
326
-
327
- ### [0.7.0](https://github.com/richpeck/exception_handler/releases/tag/0.7.0)
328
- - [x] Wildcard mime types
329
- - [x] [Custom exceptions](#custom_exceptions)
330
- - [x] Test suite integration
331
- - [x] [Email](#email)
332
- - [x] [Model backend](#database)
333
- - [x] Sprockets 4+
334
- - [x] New layout
335
- - [x] Readme / wiki overhaul
336
-
337
- ### [0.6.5](https://github.com/richpeck/exception_handler/releases/tag/0.6.5)
338
- - [x] Streamlined interface
339
- - [x] ActiveRecord / Middleware overhaul
340
- - [x] Supports Sprockets 4+ ([`manifest.js`](http://eileencodes.com/posts/the-sprockets-4-manifest/))
341
- - [x] Email integration
342
- - [x] Asset overhaul & improvement
343
- - [x] Removed dependencies
344
-
345
- ### [0.5.0](https://github.com/richpeck/exception_handler/releases/tag/0.5.0)
346
- - [x] Locales
347
- - [x] Email notifications
348
- - [x] Full test suite
349
- - [x] Rails 4.2 & Rails 5.0 native ([`request.env`](https://github.com/rails/rails/commit/05934d24aff62d66fc62621aa38dae6456e276be) fix)
350
- - [x] Controller fixed
351
- - [x] `DB` fixed
352
- - [x] Legacy initializer support ([more](https://github.com/richpeck/exception_handler/wiki/1-Setup))
353
- - [x] Rails asset management improvement
354
- - [x] Reduced gem file size
355
-
356
- ### [0.4.7](https://github.com/richpeck/exception_handler/releases/tag/0.4.6)
357
- - [x] New config system
358
- - [x] Fixed controller layout issues
359
- - [x] Streamlined middleware
360
- - [x] New layout & interface
361
-
362
- ----
363
-
364
- [![404 + 500 Errors][banner]][rubygems]
365
-
366
- <p align="center">
367
- <strong><a href="#">ExceptionHandler</a> is now the leading custom error pages gem for Rails.</strong>
368
- <br />
369
- No other gem is as simple or effective at providing beautiful exception pages in production.
370
- </p>
371
-
372
- <p align="center">
373
- <a href="http://badge.fury.io/rb/exception_handler"><img src="https://badge.fury.io/rb/exception_handler.svg" align="absmiddle"></a>
374
- <a href="http://rubygems.org/gems/exception_handler"><img src="http://ruby-gem-downloads-badge.herokuapp.com/exception_handler/0.5.1?type=total&color=brightgreen" align="absmiddle" /></a>
375
- <a href="https://codeclimate.com/github/richpeck/exception_handler"><img src="https://codeclimate.com/github/richpeck/exception_handler/badges/gpa.svg" align="absmiddle"/></a>
376
- <a href="https://gemnasium.com/richpeck/exception_handler"><img src="https://gemnasium.com/richpeck/exception_handler.svg" align="absmiddle"></a>
377
- <a href='https://coveralls.io/github/richpeck/exception_handler?branch=master'><img src='https://coveralls.io/repos/github/richpeck/exception_handler/badge.svg?branch=master' alt='Coverage Status' align="absmiddle" /></a>
378
- <a href="https://travis-ci.org/richpeck/exception_handler"><img src="https://travis-ci.org/richpeck/exception_handler.svg?branch=master" align="absmiddle"></a>
379
- </p>
380
-
381
- <p align="center">
382
- <strong><a href="https://rubygems.org/gems/exception_handler">Download Here</a></strong>
383
- </p>
384
-
385
- ----------
386
-
387
- :copyright: <a href="http://www.frontlineutilities.co.uk" align="absmiddle" ><img src="readme/fl.jpg" height="22" align="absmiddle" /></a> <a href="http://stackoverflow.com/users/1143732/richard-peck?tab=profile" align="absmiddle" ><img src="https://avatars0.githubusercontent.com/u/1104431" height="22" align="absmiddle" /></a>
388
-
389
- <!-- ################################### -->
390
- <!-- ################################### -->
391
-
392
- <!-- Refs -->
393
- <!-- Comments http://stackoverflow.com/a/20885980/1143732 -->
394
- <!-- Images https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#images -->
395
-
396
- <!-- Images -->
397
- [dev_mode]: readme/dev_mode.jpg
398
- [dev_img]: readme/dev.png
399
- [layouts_img]: readme/layouts.jpg
400
- [layout_img]: readme/layout.png
401
- [view_img]: readme/view.jpg
402
- [http_codes]: readme/http_codes.png
403
- [config]: readme/config.jpg
404
- [config.action_dispatch.rescue_responses]: readme/config.action_dispatch.rescue_responses.jpg
405
- [banner]: readme/banner.jpg
406
- [gem]: readme/gem.jpg
407
- [gemfile]: readme/gemfile.jpg
408
- [middleware]: readme/middleware.jpg
409
- [exceptions_app]: readme/exceptions_app.jpg
410
- [view]: readme/titles/view.jpg
411
- [dev]: readme/titles/dev.jpg
412
- [db]: readme/titles/db.png
413
- [support]: readme/titles/support.png "Support"
414
- [changelog]: readme/titles/changelog.png "Changelog"
415
- [contribution]: readme/titles/contributions.png "Contributions"
416
- [fl]: readme/fl.jpg "Frontline Utilities LTD"
417
- [profile]: https://avatars0.githubusercontent.com/u/1104431 "R Peck"
418
-
419
- <!-- Links -->
420
- [better_errors]: https://github.com/charliesome/better_errors
421
- [layout]: app/views/layouts/exception.html.erb
422
- [status_codes]: http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option
423
- [stackoverflow]: http://stackoverflow.com/questions/ask?tags=ruby-on-rails+exception-handler
424
- [rescue_responses]: http://guides.rubyonrails.org/configuring.html#configuring-action-dispatch
425
- [latest]: https://github.com/richpeck/exception_handler/releases/latest
426
- [show_exception]: https://github.com/rails/rails/blob/4-0-stable/actionpack/lib/action_dispatch/middleware/show_exceptions.rb
427
- [exception_app]: http://guides.rubyonrails.org/configuring.html#rails-general-configuration
428
- [rubygems]: http://rubygems.org/gems/exception_handler
429
- [frontlineutilities.co.uk]: http://www.frontlineutilities.co.uk
430
- [stackoverflow.com]: http://stackoverflow.com/users/1143732/richard-peck?tab=profile
431
- [fork]: #fork-destination-box
432
- [pull]: http://github.com/richpeck/exception_handler/pulls
433
- [issues]: http://github.com/richpeck/exception_handler/issues
434
-
435
- <!-- ################################### -->
436
- <!-- ################################### -->
1
+ ![Exception Handler](readme/title.jpg "Exception Handler Logo")
2
+
3
+ <p align="center">
4
+ <font size="4"><strong>Custom 404 & 500 production error pages for Rails 4 & 5.</font></strong>
5
+ </p>
6
+
7
+ <p align="center">
8
+ <a href="http://badge.fury.io/rb/exception_handler"><img src="https://badge.fury.io/rb/exception_handler.svg" align="absmiddle"></a>
9
+ <a href="http://rubygems.org/gems/exception_handler"><img src="http://ruby-gem-downloads-badge.herokuapp.com/exception_handler/0.5.1?type=total&color=brightgreen" align="absmiddle" /></a>
10
+ <a href="https://codeclimate.com/github/richpeck/exception_handler"><img src="https://codeclimate.com/github/richpeck/exception_handler/badges/gpa.svg" align="absmiddle"/></a>
11
+ <a href="https://gemnasium.com/richpeck/exception_handler"><img src="https://gemnasium.com/richpeck/exception_handler.svg" align="absmiddle"></a>
12
+ <a href='https://coveralls.io/github/richpeck/exception_handler?branch=master'><img src='https://coveralls.io/repos/github/richpeck/exception_handler/badge.svg?branch=master' alt='Coverage Status' align="absmiddle" /></a>
13
+ <a href="https://travis-ci.org/richpeck/exception_handler"><img src="https://travis-ci.org/richpeck/exception_handler.svg?branch=master" align="absmiddle"></a>
14
+ </p>
15
+
16
+ <p align="center">
17
+ <strong><a href="#install">Install</a></strong> → <strong><a href="#config">Setup</a></strong> → <strong><a href="#support">Support</a></strong>
18
+ </p>
19
+
20
+ ---
21
+
22
+ <p align="center">
23
+ <img src="readme/version.jpg" /><br/>
24
+ </p>
25
+
26
+ <p align="center">
27
+ <img src="readme/check.png" height="22" title="Fully Responsive" align="absmiddle" />&nbsp; <strong>Responsive</strong> &nbsp;
28
+ <img src="readme/check.png" height="22" title="Branded Error Pages" align="absmiddle" />&nbsp; <strong>Branded Error Pages</strong> &nbsp;
29
+ <img src="readme/check.png" height="22" title="Middleware Exception Handling" align="absmiddle" />&nbsp; <strong>Middleware Exception Handling</strong> &nbsp;
30
+ <img src="readme/check.png" height="22" title="Keep Users Informed" align="absmiddle" />&nbsp; <strong>Fully Customizable</strong> &nbsp;
31
+ </p>
32
+
33
+ <p align="center">
34
+ <img src="readme/branded/1.jpg" width="425" title="Fully Branded Error Pages" /> <img src="readme/branded/2.jpg" width="425" title="Fully Branded Error Pages" />
35
+ <img src="readme/branded/3.jpg" width="425" title="Fully Branded Error Pages" /> <img src="readme/branded/4.jpg" width="425" title="Fully Branded Error Pages" />
36
+ </p>
37
+
38
+ ---
39
+
40
+ <p align="center">
41
+ <img src="readme/rails.jpg" title="Version 0.7.5 Released Early 2017" />
42
+ </p>
43
+
44
+ ---
45
+
46
+ <p align="center">
47
+ <img src="readme/titles/rails5.png" title="Fully Rails 5 Compatible" width="625" />
48
+ </p>
49
+
50
+ <p align="center">
51
+ <img src="readme/check_02.png" height="22" title="New Controller" align="absmiddle" />&nbsp; <strong align="absmiddle">New Controller</strong> &nbsp;
52
+ <img src="readme/check_02.png" height="22" title="New Middleware" align="absmiddle" />&nbsp; <strong align="absmiddle">New Middleware</strong> &nbsp;
53
+ <img src="readme/check_02.png" height="22" title="Full Test Suite" align="absmiddle" />&nbsp; <strong align="absmiddle">Full Test Suite</strong> &nbsp;
54
+ <img src="readme/check_02.png" height="22" title="Rails 4 & 5 Compatible" align="absmiddle" />&nbsp; <strong align="absmiddle">Fully Rails 4 & 5 Compatible</strong> &nbsp;
55
+ </p>
56
+
57
+ Brand new `controller` & `middleware` have made **`ExceptionHandler`** even more powerful & efficient. Now you can use `ExceptionHandler` with a [single click](#install) → **plug and play** custom exception pages:
58
+
59
+ <p align="center">
60
+ <br />
61
+ <img src="readme/400.png" title="400 Errors" width="430" />
62
+ <img src="readme/500.png" title="500 Errors" width="430" />
63
+ </p>
64
+
65
+ <p align="center">For over 3 years, <strong>ExceptionHandler</strong> has provided production-level <strong>Rails</strong> exception handling for <strong>4xx</strong> and <strong>5xx</strong> errors:</p>
66
+
67
+ ![HTTP Error Codes][http_codes]
68
+
69
+ Since **browsers only read `4xx` & `5xx` error codes**, all Rails exceptions have to be inferred. Thus, `ExceptionHandler` simply has to manage how the `4xx` / `5xx` errors are passed to the browser.
70
+
71
+ Unlike other gems, **`ExceptionHandler` uses a custom [`controller`](app/controllers/exception_handler/exceptions_controller.rb) to build an [`@exception`](app/models/exception_handler/exception.rb) object**. This allows us to save the exception, email it or do anything else we may need. The gem has already been a massive success and we continue to actively maintain it.
72
+
73
+ Now you can try for yourself ...
74
+
75
+
76
+ ----
77
+
78
+ <p align="center">
79
+ <br />
80
+ <img src="readme/titles/middleware.png" title="Middleware-Powered Exceptions" width="400" />
81
+ </p>
82
+
83
+ The secret lies in [**`config.exceptions_app`**][exception_app] ↴
84
+
85
+ > **`config.exceptions_app`** sets the exceptions application invoked by the **`ShowException`** middleware when an exception happens. Defaults to **`ActionDispatch::PublicExceptions.new(Rails.public_path)`**
86
+
87
+ ![Exceptions handled by the ActiveDispatch::ShowExceptions Middleware][middleware]
88
+
89
+ Each time an exception is raised, [`ShowExceptions`][show_exception] takes the request and forwards it to `config.exceptions_app`. This is expected to return a response - allowing us to inject a [`controller`](app/controllers/exception_handler/exceptions_controller.rb):
90
+
91
+ ![config.exceptions_app - The key to all Rails exceptions][exceptions_app]
92
+
93
+ Because our callback maintains the request, we are able to do whatever we need before serving a response. This is a **major** advantage over the "default" (routes). The routes invokes Rails twice and does not persist the request.
94
+
95
+ **`ExceptionHandler` is the only gem to provide middleware-powered exception handling.** It populates our custom `view` with details, giving us the ability to **maintain branding** when exceptions are raised:
96
+
97
+ ![Exceptions handled by the ActiveDispatch::ShowExceptions Middleware][middleware]
98
+
99
+ **`ExceptionHandler` is the most EFFECTIVE and EFFICIENT gem to handle exceptions in Rails**.
100
+
101
+ Once invoked, its `model`, `controller` and `views` work together to serve the best responses to Rails errors ...
102
+
103
+ ----------
104
+
105
+ <p align="center" id="install">
106
+ <br />
107
+ <img src="readme/titles/install.png" title="1 Click Install for ExceptionHandler 0.7.0 on Rails 5" width="400" />
108
+ <br />
109
+ <strong>Custom Rails Error Pages - ZERO configuration needed:</strong>
110
+ <br />
111
+ </p>
112
+
113
+ <p align="center">
114
+ <a href="http://rubygems.org/gems/exception_handler"><img src="readme/gem.jpg" /></a> <a href="http://rubygems.org/gems/exception_handler"><img src="readme/gemfile.jpg" /></a>
115
+ </p>
116
+
117
+
118
+ <p align="center">
119
+ You can install it from the <strong>CLI</strong> or <strong>Gemfile</strong> - it will AUTOMATICALLY run in <strong>production</strong>.
120
+ <br />
121
+ <strong>↓ To run in development, use <a href="#dev-mode">dev mode</a> ↓</strong>
122
+ </p>
123
+
124
+ ---
125
+
126
+ <p align="center">
127
+ If you want to set it up your way, you can use these features...
128
+ </p>
129
+
130
+ <p align="center">
131
+ <a href="#config"><img src="readme/titles/icons/config.png" alt="Cinfiguration Options" align="absmiddle" height="24" /> Config</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#dev-mode" title="Dev Mode"><img src="readme/titles/icons/dev.png" alt="Dev" align="absmiddle" height="24" /> Dev</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#database"><img src="readme/titles/icons/database.png" alt="Database" align="absmiddle" height="24" /> Database</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#email"><img src="readme/titles/icons/email.png" alt="Email" align="absmiddle" height="24" /> Email</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#views"><img src="readme/titles/icons/views.png" alt="Views" align="absmiddle" height="24" /> Views</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#locales"><img src="readme/titles/icons/locales.png" alt="Locales" align="absmiddle" height="20" /> Locales</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#custom-exceptions"><img src="readme/titles/icons/custom.png" alt="Custom Exceptions" align="absmiddle" height="18" /> Custom Exceptions</a>&nbsp;&nbsp;&nbsp;&nbsp;<a href="#generators"><img src="readme/titles/icons/generators.png" alt="Generators" align="absmiddle" height="24" /> Generators</a>
132
+ </p>
133
+
134
+ ----
135
+
136
+ ## Config
137
+
138
+ **From [`0.4.7`](https://github.com/richpeck/exception_handler/releases/tag/0.4.6), `ExceptionHandler` manages its [config](lib/exception_handler/config.rb#L45) from the central Rails `config` hash:**
139
+
140
+ [![config][config]](lib/exception_handler/config.rb#L45)
141
+
142
+ If you're using an [`engine`](http://guides.rubyonrails.org/engines.html), you don't need to use an `initializer`:
143
+
144
+ # lib/engine.rb
145
+ module YourModule
146
+ class Engine < Rails::Engine
147
+
148
+ # => ExceptionHandler
149
+ # => Works in and out of an initializer
150
+ config.exception_handler = {
151
+ dev: false,
152
+ db: true
153
+ }
154
+ end
155
+
156
+ end
157
+
158
+ You only need to provide the inputs you want, for example:
159
+
160
+ # config/application.rb
161
+ config.exception_handler = { dev: true }
162
+
163
+ # config/environments/production.rb
164
+ config.exception_handler = { social: { fusion: "flutils" }}
165
+
166
+ ----
167
+
168
+ ## Dev Mode
169
+
170
+ **To enable `ExceptionHandler` in dev, enable the [`dev`](lib/exception_handler/config.rb#L38) option:**
171
+
172
+ ![Dev][dev_mode]
173
+
174
+ This disables [`config.consider_all_requests_local`](http://guides.rubyonrails.org/configuring.html#rails-general-configuration), making Rails behave as it would in production:
175
+
176
+ ![Dev][dev_img]
177
+
178
+ ----
179
+
180
+ ## Database
181
+
182
+ **We also have `ActiveRecord` integration.**
183
+
184
+ If you want to save your exceptions to `db`, you need to enable the `db` config option:
185
+
186
+ # config/application.rb
187
+ config.exception_handler = {
188
+ db: true
189
+ }
190
+
191
+ This enables `ActiveRecord::Base` on the [`Exception`](app/models/exception_handler/exception.rb) class, allowing us to save to the database.
192
+
193
+ In order for this to work, your db needs the correct table.
194
+
195
+ To do this, once you've enabled the option, run `rails db:migrate` from your console. Our new [`migration system`](https://github.com/richpeck/exception_handler/tree/readme#migrations) will automatically run the migration.
196
+
197
+ ---
198
+
199
+ ## Email
200
+
201
+ **`ExceptionHandler` also now sends email notifications.**
202
+
203
+ If you want to receive emails whenever your application raises an error, you can do so by adding your email to the config:
204
+
205
+ # config/application.rb
206
+ config.exception_handler = {
207
+ email: "your@email.com"
208
+ }
209
+
210
+ > **Please Note** this requires [`ActionMailer`](http://guides.rubyonrails.org/action_mailer_basics.html). If you don't have any outbound SMTP server, [`SendGrid`](http://sendgrid.com) is free.
211
+
212
+ [Full tutorial here](https://github.com/richpeck/exception_handler/wiki/2-Email)
213
+
214
+ ---
215
+
216
+ ## Views
217
+
218
+ **From [`0.7.0`](#070), we overhauled the view system:**
219
+
220
+ ![View][view_img]
221
+
222
+ [Wiew](app/views/exception_handler/exceptions/show.html.erb) is modular - `@exception` populated with [`locales`](#locales).
223
+
224
+ ---
225
+
226
+ ## Locales
227
+
228
+ **[`0.7.5`](https://github.com/richpeck/exception_handler/releases/tag/0.7.5) introduced [locales](config/locales/exception_handler.yml) ...**
229
+
230
+ [[ locales ]]
231
+
232
+ The `ExceptionHandler` view is populated by [`@exception.description`](app/models/exception_handler/exception.rb#L121), which pulls from the `locales`.
233
+
234
+ If you want custom messages, you need the following. The key is defined by the HTTP [`status_code`](https://github.com/rack/rack/blob/1.5.2/lib/rack/utils.rb#L544)
235
+
236
+ # config/locales/en.yml
237
+ en:
238
+ exception_handler:
239
+ not_found: "Your message here"
240
+ unauthorized: "You need to login to continue"
241
+ internal_server_error: "This is a test to show the %{status} of the error"
242
+
243
+ You get access to `%{message}` and `%{status}`, both inferring from `@exception`.
244
+
245
+ ---
246
+
247
+ ## Layout
248
+
249
+ **The `layout` has also been improved ↴**
250
+
251
+ ![Layout][layout_img]
252
+
253
+ We now assign layouts to the **status code** of the response:
254
+
255
+ ![Layout][layouts_img]
256
+
257
+ By default, `5xx` errors are shown with our [`exception` layout][layout] - this can be overridden by changing the `config` to use a layout of your choice. If you want to inherit the `ApplicationController` layout, assign the codes to `nil`.
258
+
259
+ ---
260
+
261
+
262
+ ## Custom Exceptions
263
+
264
+ **Custom Exceptions also supported in [`0.7.5`](https://github.com/richpeck/exception_handler/releases/tag/0.7.5)**
265
+
266
+ Rails handles this for us - [**`config.action_dispatch.rescue_responses`**][rescue_responses] ↴
267
+
268
+ ![ActionDispatch][config.action_dispatch.rescue_responses]
269
+
270
+ You need to add to the `rescue_responses` hash in your app's config (mapped to [`status codes`](https://github.com/rack/rack/blob/1.5.2/lib/rack/utils.rb#L544)):
271
+
272
+ # config/application.rb
273
+ config.action_dispatch.rescue_responses["ActionController::YourError"] = :bad_request
274
+
275
+ Because `HTTP` can only process `4xx` / `5xx` errors, if `Rails` raises an exception, it needs to assign one of the error status codes. **Default** is [`internal_server_error`](https://github.com/rack/rack/blob/1.5.2/lib/rack/utils.rb#L595) - if you'd prefer your app to just return `500` errors for your custom exception, you don't need to explicitly declare them.
276
+
277
+ ---
278
+
279
+ ## Generators
280
+
281
+ **You can generate `ExceptionHandler` into your own application.**
282
+
283
+ [[ Generator ]]
284
+
285
+ The following commands will copy the directories...
286
+
287
+ rails g exception_handler:views
288
+ rails g exception_handler:views -v views
289
+ rails g exception_handler:views -v controllers
290
+ rails g exception_handler:views -v models
291
+ rails g exception_handler:views -v assets
292
+ rails g exception_handler:views -v views controllers models assets
293
+
294
+ If you don't include any switches, this will copy **all** the folders put into your app.
295
+
296
+ Each switch defines which folders you want (EG `-v views` will only copy `views` dir).
297
+
298
+ ---
299
+
300
+ ### Migrations (deprecated)
301
+
302
+ **From [`0.7.5`](https://github.com/richpeck/exception_handler/releases/tag/0.7.5), the `migration` generator has been removed in favour of our own [migration system](lib/exception_handler/engine.rb#L58)**
303
+
304
+ You don't need to generate a migration any more.
305
+
306
+ If you set the `db` option in config, run `rails db:migrate` and the migration will be run.
307
+
308
+ To rollback, use the following:
309
+
310
+ rails db:migrate:down VERSION=000000
311
+
312
+ > The drawback to this is that if you remove `ExceptionHandler` before you rollback the migration, it won't exist anymore. You can **only** fire the `rollback` when you have `ExceptionHandler` installed.
313
+
314
+ ---
315
+
316
+ ## Support
317
+
318
+ [Issues](https://github.com/richpeck/exception_handler/issues)
319
+
320
+ ---
321
+
322
+ ## Changelog
323
+
324
+ ### [0.7.5](https://github.com/richpeck/exception_handler/releases/tag/0.7.5)
325
+ - [x] [HTTP status layouts](#layouts)
326
+
327
+ ### [0.7.0](https://github.com/richpeck/exception_handler/releases/tag/0.7.0)
328
+ - [x] Wildcard mime types
329
+ - [x] [Custom exceptions](#custom_exceptions)
330
+ - [x] Test suite integration
331
+ - [x] [Email](#email)
332
+ - [x] [Model backend](#database)
333
+ - [x] Sprockets 4+
334
+ - [x] New layout
335
+ - [x] Readme / wiki overhaul
336
+
337
+ ### [0.6.5](https://github.com/richpeck/exception_handler/releases/tag/0.6.5)
338
+ - [x] Streamlined interface
339
+ - [x] ActiveRecord / Middleware overhaul
340
+ - [x] Supports Sprockets 4+ ([`manifest.js`](http://eileencodes.com/posts/the-sprockets-4-manifest/))
341
+ - [x] Email integration
342
+ - [x] Asset overhaul & improvement
343
+ - [x] Removed dependencies
344
+
345
+ ### [0.5.0](https://github.com/richpeck/exception_handler/releases/tag/0.5.0)
346
+ - [x] Locales
347
+ - [x] Email notifications
348
+ - [x] Full test suite
349
+ - [x] Rails 4.2 & Rails 5.0 native ([`request.env`](https://github.com/rails/rails/commit/05934d24aff62d66fc62621aa38dae6456e276be) fix)
350
+ - [x] Controller fixed
351
+ - [x] `DB` fixed
352
+ - [x] Legacy initializer support ([more](https://github.com/richpeck/exception_handler/wiki/1-Setup))
353
+ - [x] Rails asset management improvement
354
+ - [x] Reduced gem file size
355
+
356
+ ### [0.4.7](https://github.com/richpeck/exception_handler/releases/tag/0.4.6)
357
+ - [x] New config system
358
+ - [x] Fixed controller layout issues
359
+ - [x] Streamlined middleware
360
+ - [x] New layout & interface
361
+
362
+ ----
363
+
364
+ [![404 + 500 Errors][banner]][rubygems]
365
+
366
+ <p align="center">
367
+ <strong><a href="#">ExceptionHandler</a> is now the leading custom error pages gem for Rails.</strong>
368
+ <br />
369
+ No other gem is as simple or effective at providing beautiful exception pages in production.
370
+ </p>
371
+
372
+ <p align="center">
373
+ <a href="http://badge.fury.io/rb/exception_handler"><img src="https://badge.fury.io/rb/exception_handler.svg" align="absmiddle"></a>
374
+ <a href="http://rubygems.org/gems/exception_handler"><img src="http://ruby-gem-downloads-badge.herokuapp.com/exception_handler/0.5.1?type=total&color=brightgreen" align="absmiddle" /></a>
375
+ <a href="https://codeclimate.com/github/richpeck/exception_handler"><img src="https://codeclimate.com/github/richpeck/exception_handler/badges/gpa.svg" align="absmiddle"/></a>
376
+ <a href="https://gemnasium.com/richpeck/exception_handler"><img src="https://gemnasium.com/richpeck/exception_handler.svg" align="absmiddle"></a>
377
+ <a href='https://coveralls.io/github/richpeck/exception_handler?branch=master'><img src='https://coveralls.io/repos/github/richpeck/exception_handler/badge.svg?branch=master' alt='Coverage Status' align="absmiddle" /></a>
378
+ <a href="https://travis-ci.org/richpeck/exception_handler"><img src="https://travis-ci.org/richpeck/exception_handler.svg?branch=master" align="absmiddle"></a>
379
+ </p>
380
+
381
+ <p align="center">
382
+ <strong><a href="https://rubygems.org/gems/exception_handler">Download Here</a></strong>
383
+ </p>
384
+
385
+ ----------
386
+
387
+ :copyright: <a href="http://www.frontlineutilities.co.uk" align="absmiddle" ><img src="readme/fl.jpg" height="22" align="absmiddle" /></a> <a href="http://stackoverflow.com/users/1143732/richard-peck?tab=profile" align="absmiddle" ><img src="https://avatars0.githubusercontent.com/u/1104431" height="22" align="absmiddle" /></a>
388
+
389
+ <!-- ################################### -->
390
+ <!-- ################################### -->
391
+
392
+ <!-- Refs -->
393
+ <!-- Comments http://stackoverflow.com/a/20885980/1143732 -->
394
+ <!-- Images https://github.com/adam-p/markdown-here/wiki/Markdown-Cheatsheet#images -->
395
+
396
+ <!-- Images -->
397
+ [dev_mode]: readme/dev_mode.jpg
398
+ [dev_img]: readme/dev.png
399
+ [layouts_img]: readme/layouts.jpg
400
+ [layout_img]: readme/layout.png
401
+ [view_img]: readme/view.jpg
402
+ [http_codes]: readme/http_codes.png
403
+ [config]: readme/config.jpg
404
+ [config.action_dispatch.rescue_responses]: readme/config.action_dispatch.rescue_responses.jpg
405
+ [banner]: readme/banner.jpg
406
+ [gem]: readme/gem.jpg
407
+ [gemfile]: readme/gemfile.jpg
408
+ [middleware]: readme/middleware.jpg
409
+ [exceptions_app]: readme/exceptions_app.jpg
410
+ [view]: readme/titles/view.jpg
411
+ [dev]: readme/titles/dev.jpg
412
+ [db]: readme/titles/db.png
413
+ [support]: readme/titles/support.png "Support"
414
+ [changelog]: readme/titles/changelog.png "Changelog"
415
+ [contribution]: readme/titles/contributions.png "Contributions"
416
+ [fl]: readme/fl.jpg "Frontline Utilities LTD"
417
+ [profile]: https://avatars0.githubusercontent.com/u/1104431 "R Peck"
418
+
419
+ <!-- Links -->
420
+ [better_errors]: https://github.com/charliesome/better_errors
421
+ [layout]: app/views/layouts/exception.html.erb
422
+ [status_codes]: http://guides.rubyonrails.org/layouts_and_rendering.html#the-status-option
423
+ [stackoverflow]: http://stackoverflow.com/questions/ask?tags=ruby-on-rails+exception-handler
424
+ [rescue_responses]: http://guides.rubyonrails.org/configuring.html#configuring-action-dispatch
425
+ [latest]: https://github.com/richpeck/exception_handler/releases/latest
426
+ [show_exception]: https://github.com/rails/rails/blob/4-0-stable/actionpack/lib/action_dispatch/middleware/show_exceptions.rb
427
+ [exception_app]: http://guides.rubyonrails.org/configuring.html#rails-general-configuration
428
+ [rubygems]: http://rubygems.org/gems/exception_handler
429
+ [frontlineutilities.co.uk]: http://www.frontlineutilities.co.uk
430
+ [stackoverflow.com]: http://stackoverflow.com/users/1143732/richard-peck?tab=profile
431
+ [fork]: #fork-destination-box
432
+ [pull]: http://github.com/richpeck/exception_handler/pulls
433
+ [issues]: http://github.com/richpeck/exception_handler/issues
434
+
435
+ <!-- ################################### -->
436
+ <!-- ################################### -->