Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Suppressing ActionView::MissingTemplate exception for Rails 3.x

Starting with Rails 3.0, from time to time, I've been receiving an exception notification like this:

ActionView::MissingTemplate: Missing template [...] with {:locale=>[:en],
  :formats=>[:text], :handlers=>[:erb, :builder, :haml]}. Searched in: * [...]

For instance, an arbitrary hand-written URL like http://example.com/some/path/robots.txt raises the error. Not fun.

I reported the problem in this ticket quite a long ago, and been using the patch mentioned here, but the problem persists.

https://rails.lighthouseapp.com/projects/8994/tickets/6022-content-negotiation-fails-for-some-headers-regression

A fix is suggested in this blog post,

http://trevorturk.wordpress.com/2011/12/09/handling-actionviewmissingtemplate-exceptions/

To use this:

respond_to do |format|
  format.js
end

But it doesn't feel right to me, as I'm not interested in overloading an action with multiple formats. In my app, there are separate URLs for HTML and JSON API, so simple render should be sufficient.

Should I just swallow the exception by rescue_from ActionView::MissingTemplate and return 406 myself?

Is there a better way to handle this situation?

Or I can ask this way - in the first place, is there any real-world usefulness in raising this kind of exception on production?

like image 990
kenn Avatar asked Mar 10 '12 02:03

kenn


1 Answers

If you've no need for formatted routes you can disable them with :format => false in your route specification, e.g.

get '/products' => 'products#index', :format => false

This will generate a RoutingError which gets converted to a 404 Not Found. Alternatively you can restrict it to a number of predefined formats:

get '/products' => 'products#index', :format => /(?:|html|json)/

If you want a formatted url but want it restricted to a single format then you can do this:

get '/products.json' => 'products#index', :format => false, :defaults => { :format => 'json' }

There are a number of valid reasons to raise this error in production - a missing file from a deploy for example or perhaps you'd want notification of someone trying to hack your application's urls.

like image 131
pixeltrix Avatar answered Oct 13 '22 11:10

pixeltrix