You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							104 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
	
	
							104 lines
						
					
					
						
							4.2 KiB
						
					
					
				# Better Errors [](https://rubygems.org/gems/better_errors) [](https://travis-ci.org/charliesome/better_errors) [](https://codeclimate.com/github/charliesome/better_errors)
 | 
						|
 | 
						|
Better Errors replaces the standard Rails error page with a much better and more useful error page. It is also usable outside of Rails in any Rack app as Rack middleware.
 | 
						|
 | 
						|

 | 
						|
 | 
						|
## Features
 | 
						|
 | 
						|
* Full stack trace
 | 
						|
* Source code inspection for all stack frames (with highlighting)
 | 
						|
* Local and instance variable inspection
 | 
						|
* Live REPL on every stack frame
 | 
						|
 | 
						|
## Installation
 | 
						|
 | 
						|
Add this to your Gemfile:
 | 
						|
 | 
						|
```ruby
 | 
						|
group :development do
 | 
						|
  gem "better_errors"
 | 
						|
end
 | 
						|
```
 | 
						|
 | 
						|
If you would like to use Better Errors' **advanced features** (REPL, local/instance variable inspection, pretty stack frame names), you need to add the [`binding_of_caller`](https://github.com/banister/binding_of_caller) gem by [@banisterfiend](http://twitter.com/banisterfiend) to your Gemfile:
 | 
						|
 | 
						|
```ruby
 | 
						|
gem "binding_of_caller"
 | 
						|
```
 | 
						|
 | 
						|
This is an optional dependency however, and Better Errors will work without it.
 | 
						|
 | 
						|
_Note: If you discover that Better Errors isn't working - particularly after upgrading from version 0.5.0 or less - be sure to set `config.consider_all_requests_local = true` in `config/environments/development.rb`._
 | 
						|
 | 
						|
## Security
 | 
						|
 | 
						|
**NOTE:** It is *critical* you put better\_errors in the **development** section. **Do NOT run better_errors in production, or on Internet facing hosts.**
 | 
						|
 | 
						|
You will notice that the only machine that gets the Better Errors page is localhost, which means you get the default error page if you are developing on a remote host (or a virtually remote host, such as a Vagrant box). Obviously, the REPL is not something you want to expose to the public, but there may also be other pieces of sensitive information available in the backtrace.
 | 
						|
 | 
						|
To poke selective holes in this security mechanism, you can add a line like this to your startup (for example, on Rails it would be `config/environments/development.rb`)
 | 
						|
 | 
						|
```ruby
 | 
						|
BetterErrors::Middleware.allow_ip! ENV['TRUSTED_IP'] if ENV['TRUSTED_IP']
 | 
						|
```
 | 
						|
 | 
						|
Then run Rails like this:
 | 
						|
 | 
						|
```shell
 | 
						|
TRUSTED_IP=66.68.96.220 rails s
 | 
						|
```
 | 
						|
 | 
						|
Note that the `allow_ip!` is actually backed by a `Set`, so you can add more than one IP address or subnet.
 | 
						|
 | 
						|
**Tip:** You can find your apparent IP by hitting the old error page's "Show env dump" and looking at "REMOTE_ADDR".
 | 
						|
 | 
						|
**VirtualBox:** If you are using VirtualBox and are accessing the guest from your host's browser, you will need to use `allow_ip!` to see the error page.
 | 
						|
 | 
						|
## Usage
 | 
						|
 | 
						|
If you're using Rails, there's nothing else you need to do.
 | 
						|
 | 
						|
If you're not using Rails, you need to insert `BetterErrors::Middleware` into your middleware stack, and optionally set `BetterErrors.application_root` if you'd like Better Errors to abbreviate filenames within your application.
 | 
						|
 | 
						|
Here's an example using Sinatra:
 | 
						|
 | 
						|
```ruby
 | 
						|
require "sinatra"
 | 
						|
require "better_errors"
 | 
						|
 | 
						|
configure :development do
 | 
						|
  use BetterErrors::Middleware
 | 
						|
  BetterErrors.application_root = __dir__
 | 
						|
end
 | 
						|
 | 
						|
get "/" do
 | 
						|
  raise "oops"
 | 
						|
end
 | 
						|
```
 | 
						|
 | 
						|
### Unicorn, Puma, and other multi-worker servers
 | 
						|
 | 
						|
Better Errors works by leaving a lot of context in server process memory. If
 | 
						|
you're using a web server that runs multiple "workers" it's likely that a second
 | 
						|
request (as happens when you click on a stack frame) will hit a different
 | 
						|
worker. That worker won't have the necessary context in memory, and you'll see
 | 
						|
a `Session Expired` message.
 | 
						|
 | 
						|
If this is the case for you, consider turning the number of workers to one (1)
 | 
						|
in `development`. Another option would be to use Webrick, Mongrel, Thin,
 | 
						|
or another single-process server as your `rails server`, when you are trying
 | 
						|
to troubleshoot an issue in development.
 | 
						|
 | 
						|
## Get in touch!
 | 
						|
 | 
						|
If you're using better_errors, I'd love to hear from you. Drop me a line and tell me what you think!
 | 
						|
 | 
						|
## Contributing
 | 
						|
 | 
						|
1. Fork it
 | 
						|
2. Create your feature branch (`git checkout -b my-new-feature`)
 | 
						|
3. Commit your changes (`git commit -am 'Add some feature'`)
 | 
						|
4. Push to the branch (`git push origin my-new-feature`)
 | 
						|
5. Create new Pull Request
 |