goalie 0.0.0 → 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +93 -0
- data/app/controllers/local_errors_controller.rb +0 -1
- data/app/controllers/public_errors_controller.rb +14 -5
- data/app/views/public_errors/forbidden.html +25 -0
- data/app/views/public_errors/internal_server_error.html +0 -1
- data/app/views/public_errors/not_found.html +0 -1
- data/app/views/public_errors/unprocessable_entity.html +0 -1
- data/goalie.gemspec +63 -0
- data/lib/goalie/exceptions.rb +6 -0
- data/lib/goalie/version.rb +1 -1
- data/lib/goalie.rb +23 -22
- data/todo.org +0 -8
- metadata +9 -6
- data/README +0 -0
data/README.md
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
## Goalie
|
2
|
+
|
3
|
+
Goalie is a flexible dynamic error response renderer for Rails built
|
4
|
+
on Rack and Rails Engines. It provides the same default error pages as
|
5
|
+
Rails, but allows you to easily customize them with *dynamic*
|
6
|
+
content. This means you can use your application layout, have
|
7
|
+
different error pages for different subdomains, and do all sorts nice
|
8
|
+
things.
|
9
|
+
|
10
|
+
## Installation
|
11
|
+
|
12
|
+
WARNING: at this point, Goalie is highly experimental and should not
|
13
|
+
be used in production!! Everything can and probably will change before
|
14
|
+
it is ready for production. Install it only if you want to play with
|
15
|
+
and/or contribute to it.
|
16
|
+
|
17
|
+
gem install goalie
|
18
|
+
|
19
|
+
After you install it and add it to your `Gemfile`, you have to require
|
20
|
+
it together with Rails' frameworks at the top of your
|
21
|
+
`config/application.rb` file:
|
22
|
+
|
23
|
+
require 'goalie/rails'
|
24
|
+
|
25
|
+
This will remove Rails' default exception renderer middleware
|
26
|
+
(`ShowExceptions`) and use Goalie's instead. Unless you have custom
|
27
|
+
static pages in your `public` directory (which we plan to support
|
28
|
+
later), this will be a drop-in replacement.
|
29
|
+
|
30
|
+
## Customization
|
31
|
+
|
32
|
+
### Controllers
|
33
|
+
|
34
|
+
The public (production) rescuing of errors is done by the
|
35
|
+
`PublicErrorsController` found in Goalie's `app/controllers`
|
36
|
+
directory. If you create a controller with the same name, it will
|
37
|
+
automatically be used instead of Goalie's. All it needs to do is
|
38
|
+
support the following actions:
|
39
|
+
|
40
|
+
* `internal_server_error`
|
41
|
+
* `not_found`
|
42
|
+
* `unprocessable_entity`
|
43
|
+
* `conflict`
|
44
|
+
* `method_not_allowed`
|
45
|
+
* `not_implemented`
|
46
|
+
|
47
|
+
If you don't actually need a separate action for each of these errors,
|
48
|
+
you can redirect them to others, for example, with:
|
49
|
+
|
50
|
+
def unprocessable_entity
|
51
|
+
render :action => 'internal_server_error'
|
52
|
+
end
|
53
|
+
|
54
|
+
### Views
|
55
|
+
|
56
|
+
You can also customize only the views and use Goalie's default
|
57
|
+
controller. All you need is to have inside `app/views/public_errors`
|
58
|
+
views with the same names as the actions listed above. Besides the
|
59
|
+
standard stuff that Rails makes available to views, you will also have
|
60
|
+
access to the following instance variables:
|
61
|
+
|
62
|
+
* `@request`
|
63
|
+
* `@exception`
|
64
|
+
* `@application_trace`
|
65
|
+
* `@framework_trace`
|
66
|
+
* `@full_trace`
|
67
|
+
|
68
|
+
Be VERY careful when using this in production, as you could expose
|
69
|
+
sensitive information inside the request and exception. Generally, you
|
70
|
+
probably shouldn't use these variables at all. The only place it makes
|
71
|
+
sense is to have a more detailed error screen for admins or other
|
72
|
+
high-level users.
|
73
|
+
|
74
|
+
## Credit
|
75
|
+
|
76
|
+
Goalie copies a lot of code and ideas from:
|
77
|
+
* Rails' `ShowExceptions` middleware
|
78
|
+
* Rails' default error views
|
79
|
+
* Rails' exception_notification plugin
|
80
|
+
|
81
|
+
Which are mostly the work of [Joshua Peek](http://joshpeek.com), with
|
82
|
+
help from various contributors. We're highly indebted to them and
|
83
|
+
thank them a lot for their work.
|
84
|
+
|
85
|
+
## Contributions
|
86
|
+
|
87
|
+
Any form of feedback, patches, issues, and documentation are highly
|
88
|
+
appreciated.
|
89
|
+
|
90
|
+
## License
|
91
|
+
|
92
|
+
MIT license. Copyright 2010 [Helder Ribeiro](http://helderribeiro.net).
|
93
|
+
|
@@ -1,23 +1,32 @@
|
|
1
1
|
class PublicErrorsController < ActionController::Base
|
2
|
-
self.append_view_path "#{File.dirname(__FILE__)}/../views"
|
3
2
|
|
4
|
-
|
3
|
+
# 403
|
4
|
+
def forbidden
|
5
5
|
end
|
6
6
|
|
7
|
+
# 404
|
7
8
|
def not_found
|
8
9
|
end
|
9
10
|
|
10
|
-
|
11
|
+
# 405
|
12
|
+
def method_not_allowed
|
13
|
+
render :action => 'internal_server_error'
|
11
14
|
end
|
12
15
|
|
16
|
+
# 409
|
13
17
|
def conflict
|
14
18
|
render :action => 'internal_server_error'
|
15
19
|
end
|
16
20
|
|
17
|
-
|
18
|
-
|
21
|
+
# 422
|
22
|
+
def unprocessable_entity
|
23
|
+
end
|
24
|
+
|
25
|
+
# 500
|
26
|
+
def internal_server_error
|
19
27
|
end
|
20
28
|
|
29
|
+
# 501
|
21
30
|
def not_implemented
|
22
31
|
render :action => 'internal_server_error'
|
23
32
|
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<title>You don't have permission to see this content (403)</title>
|
5
|
+
<style type="text/css">
|
6
|
+
body { background-color: #fff; color: #666; text-align: center; font-family: arial, sans-serif; }
|
7
|
+
div.dialog {
|
8
|
+
width: 25em;
|
9
|
+
padding: 0 4em;
|
10
|
+
margin: 4em auto 0 auto;
|
11
|
+
border: 1px solid #ccc;
|
12
|
+
border-right-color: #999;
|
13
|
+
border-bottom-color: #999;
|
14
|
+
}
|
15
|
+
h1 { font-size: 100%; color: #f00; line-height: 1.5em; }
|
16
|
+
</style>
|
17
|
+
</head>
|
18
|
+
|
19
|
+
<body>
|
20
|
+
<div class="dialog">
|
21
|
+
<h1>You don't have permission to see this content.</h1>
|
22
|
+
<p>You may need to acquire permission from the administrator first.</p>
|
23
|
+
</div>
|
24
|
+
</body>
|
25
|
+
</html>
|
data/goalie.gemspec
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# Generated by jeweler
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
|
+
# -*- encoding: utf-8 -*-
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = %q{goalie}
|
8
|
+
s.version = "0.0.1"
|
9
|
+
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
+
s.authors = ["Helder Ribeiro"]
|
12
|
+
s.date = %q{2010-08-11}
|
13
|
+
s.description = %q{Middleware to catch exceptions and Rails Engine to render them. Error-handling views and controllers can be easily overriden.}
|
14
|
+
s.email = %q{helder@gmail.com}
|
15
|
+
s.extra_rdoc_files = [
|
16
|
+
"README.md"
|
17
|
+
]
|
18
|
+
s.files = [
|
19
|
+
"MIT-LICENSE",
|
20
|
+
"README.md",
|
21
|
+
"Rakefile",
|
22
|
+
"app/controllers/local_errors_controller.rb",
|
23
|
+
"app/controllers/public_errors_controller.rb",
|
24
|
+
"app/views/layouts/local_errors.html.erb",
|
25
|
+
"app/views/local_errors/_request_and_response.html.erb",
|
26
|
+
"app/views/local_errors/_trace.html.erb",
|
27
|
+
"app/views/local_errors/diagnostics.html.erb",
|
28
|
+
"app/views/local_errors/missing_template.html.erb",
|
29
|
+
"app/views/local_errors/routing_error.html.erb",
|
30
|
+
"app/views/local_errors/template_error.html.erb",
|
31
|
+
"app/views/local_errors/unknown_action.html.erb",
|
32
|
+
"app/views/public_errors/forbidden.html",
|
33
|
+
"app/views/public_errors/internal_server_error.html",
|
34
|
+
"app/views/public_errors/not_found.html",
|
35
|
+
"app/views/public_errors/unprocessable_entity.html",
|
36
|
+
"goalie.gemspec",
|
37
|
+
"lib/goalie.rb",
|
38
|
+
"lib/goalie/exceptions.rb",
|
39
|
+
"lib/goalie/rails.rb",
|
40
|
+
"lib/goalie/version.rb",
|
41
|
+
"test/custom_error_pages_test.rb",
|
42
|
+
"todo.org"
|
43
|
+
]
|
44
|
+
s.homepage = %q{http://github.com/obvio171/goalie}
|
45
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
46
|
+
s.require_paths = ["lib"]
|
47
|
+
s.rubygems_version = %q{1.3.7}
|
48
|
+
s.summary = %q{Custom error pages for Rails}
|
49
|
+
s.test_files = [
|
50
|
+
"test/custom_error_pages_test.rb"
|
51
|
+
]
|
52
|
+
|
53
|
+
if s.respond_to? :specification_version then
|
54
|
+
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
55
|
+
s.specification_version = 3
|
56
|
+
|
57
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
58
|
+
else
|
59
|
+
end
|
60
|
+
else
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
data/lib/goalie/version.rb
CHANGED
data/lib/goalie.rb
CHANGED
@@ -11,25 +11,26 @@ module Goalie
|
|
11
11
|
cattr_accessor :rescue_responses
|
12
12
|
@@rescue_responses = Hash.new(:internal_server_error)
|
13
13
|
@@rescue_responses.update({
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
14
|
+
'ActionController::RoutingError' => :not_found,
|
15
|
+
'AbstractController::ActionNotFound' => :not_found,
|
16
|
+
'ActiveRecord::RecordNotFound' => :not_found,
|
17
|
+
'ActiveRecord::StaleObjectError' => :conflict,
|
18
|
+
'ActiveRecord::RecordInvalid' => :unprocessable_entity,
|
19
|
+
'ActiveRecord::RecordNotSaved' => :unprocessable_entity,
|
20
|
+
'ActionController::MethodNotAllowed' => :method_not_allowed,
|
21
|
+
'ActionController::NotImplemented' => :not_implemented,
|
22
|
+
'ActionController::InvalidAuthenticityToken' => :unprocessable_entity,
|
23
|
+
'Goalie::Forbidden' => :forbidden
|
24
|
+
})
|
24
25
|
|
25
26
|
FAILSAFE_RESPONSE = [
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
27
|
+
500,
|
28
|
+
{'Content-Type' => 'text/html'},
|
29
|
+
["<html><body><h1>500 Internal Server Error</h1>" <<
|
30
|
+
"If you are the administrator of this website, then please read " <<
|
31
|
+
"this web application's log file and/or the web server's log " <<
|
32
|
+
"file to find out what went wrong.</body></html>"]
|
33
|
+
]
|
33
34
|
|
34
35
|
def initialize(app, consider_all_requests_local = false)
|
35
36
|
@app = app
|
@@ -77,11 +78,11 @@ module Goalie
|
|
77
78
|
# controller handle different exception classes however it wants
|
78
79
|
rescue_actions = Hash.new('diagnostics')
|
79
80
|
rescue_actions.update({
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
81
|
+
'ActionView::MissingTemplate' => 'missing_template',
|
82
|
+
'ActionController::RoutingError' => 'routing_error',
|
83
|
+
'AbstractController::ActionNotFound' => 'unknown_action',
|
84
|
+
'ActionView::Template::Error' => 'template_error'
|
85
|
+
})
|
85
86
|
|
86
87
|
error_params = {
|
87
88
|
:request => request, :exception => exception,
|
data/todo.org
CHANGED
@@ -1,8 +0,0 @@
|
|
1
|
-
|
2
|
-
* Make views overridable from inside app
|
3
|
-
* Make controllers overridable from inside app
|
4
|
-
* Give proper credit to author of Rails' ShowExceptions
|
5
|
-
* Give proper credit ao author of Rails' exception_notification
|
6
|
-
* Give proper credit to Rails' default error pages that were copied
|
7
|
-
* Turn into a gem
|
8
|
-
* Create Railtie
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: goalie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 1
|
10
|
+
version: 0.0.1
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Helder Ribeiro
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2010-08-
|
18
|
+
date: 2010-08-11 00:00:00 -03:00
|
19
19
|
default_executable:
|
20
20
|
dependencies: []
|
21
21
|
|
@@ -26,10 +26,10 @@ executables: []
|
|
26
26
|
extensions: []
|
27
27
|
|
28
28
|
extra_rdoc_files:
|
29
|
-
- README
|
29
|
+
- README.md
|
30
30
|
files:
|
31
31
|
- MIT-LICENSE
|
32
|
-
- README
|
32
|
+
- README.md
|
33
33
|
- Rakefile
|
34
34
|
- app/controllers/local_errors_controller.rb
|
35
35
|
- app/controllers/public_errors_controller.rb
|
@@ -41,10 +41,13 @@ files:
|
|
41
41
|
- app/views/local_errors/routing_error.html.erb
|
42
42
|
- app/views/local_errors/template_error.html.erb
|
43
43
|
- app/views/local_errors/unknown_action.html.erb
|
44
|
+
- app/views/public_errors/forbidden.html
|
44
45
|
- app/views/public_errors/internal_server_error.html
|
45
46
|
- app/views/public_errors/not_found.html
|
46
47
|
- app/views/public_errors/unprocessable_entity.html
|
48
|
+
- goalie.gemspec
|
47
49
|
- lib/goalie.rb
|
50
|
+
- lib/goalie/exceptions.rb
|
48
51
|
- lib/goalie/rails.rb
|
49
52
|
- lib/goalie/version.rb
|
50
53
|
- test/custom_error_pages_test.rb
|
data/README
DELETED
File without changes
|