exception_handler 0.7.6.0 → 0.7.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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
+ <!-- ################################### -->