diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 01022f20b..ea502a426 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -26,6 +26,12 @@ class ApplicationController < ActionController::Base protected + def self.rescue_with(*klasses, status: 500) + rescue_from *klasses do |exception| + render_error_page(status, exception) + end + end + def show_moderation_notice? CurrentUser.can_approve_posts? && (cookies[:moderated].blank? || Time.at(cookies[:moderated].to_i) < 20.hours.ago) end diff --git a/app/controllers/favorites_controller.rb b/app/controllers/favorites_controller.rb index 5c2dabe6a..6976fce4d 100644 --- a/app/controllers/favorites_controller.rb +++ b/app/controllers/favorites_controller.rb @@ -2,6 +2,7 @@ class FavoritesController < ApplicationController before_action :member_only, except: [:index] respond_to :html, :xml, :json, :js skip_before_action :api_check + rescue_with Favorite::Error, status: 422 def index if params[:tags] diff --git a/app/views/static/error.js.erb b/app/views/static/error.js.erb index 9b142dd07..a9acdfc58 100644 --- a/app/views/static/error.js.erb +++ b/app/views/static/error.js.erb @@ -1,2 +1,10 @@ +var klass = <%= raw @exception.class.to_s.to_json %>; var message = <%= raw @message.to_json %>; -Danbooru.Utility.error(message); +var backtrace = <%= raw @backtrace.to_json %>; + +<% if @expected %> + Danbooru.Utility.error(message); +<% else %> + console.error(klass, message, backtrace); + Danbooru.Utility.error(message); +<% end %>