Sinatra-错误处理

Ism*_*hul 1 ruby sinatra

当服务器上出现错误(例如IOError或ArgumentError)时,我试图使sinatra应用程序显示自定义错误页面。

当前,我正在使用AJAX将结果加载到某个#resultsdiv中,但是如果并且在服务器上出现错误时,我希望在新页面上打开错误页面。

当前,服务器上显示IOError并在控制台中看到错误(服务器响应状态为500(内部服务器错误))。除此之外,什么也没有发生。

我认为我必须使用Javascript(以及Sinatra :: Base类),但是我花了整个整个昨天和今天的早晨。

我将非常感谢您的帮助。我为应用创建了一个过于简化的版本,如下所示...

Sinatra_app.rb

require 'sinatra/base'
require9 'sinatra'
require 'slim'

# A helper module
module GVhelpers
  def create_results(name)
    # raise IOError, "There's a problem..."
    return "<p>The Server Says 'Hey #{name}'</p>"
  end
end

class GVapp < Sinatra::Base
  helpers GVhelpers
  set :root, File.dirname(__FILE__)

  error do 
    @error = env['sinatra.error']
    slim :"500", :locals => {:error => error}
  end

  get '/' do
    slim :index
  end

  post '/form' do
    name = params[:personName]
    create_results(name)
  end
end

GVapp.run!
Run Code Online (Sandbox Code Playgroud)

index.slim(在views文件夹中)

script src="/jquery.min.js"
script src="/Gvapp.js"

form#sayHey action="/form" method="post"
  |  Name: 
  input type="text" name="personName"
  br
  input type="submit"
#output
Run Code Online (Sandbox Code Playgroud)

500.slim(在views文件夹中)

h1  Oops! Something went Wonky!
p  Apologies, there was an error with your request:
    strong  request.env['sinatra.error'].message
p  If the error persists, please contact the administrator.
Run Code Online (Sandbox Code Playgroud)

Gvapp.js(在公共文件夹中)

$(document).ready(function() {

  $('#sayHey').submit(function(e) {

    e.preventDefault();

    $.ajax({
      type: 'POST',
      url: '/form',
      data: $('#sayHey').serialize(),
      success: function(response){
        $('#output').html(response);
      }
    })

  })
})
Run Code Online (Sandbox Code Playgroud)

小智 5

Sinatra development默认情况下在环境中运行时会吞下异常,而是显示其调试错误页面。因此,要触发您的自定义错误处理程序,您必须在development(可能production)以外的Rack环境中运行该应用程序,或者最好让Sinatra 在模式下使用其默认错误处理程序development

考虑以下独立的Sinatra应用程序示例:

require "sinatra"

#disable :show_exceptions

get "/" do
  raise RuntimeError.new("boom")
end

error RuntimeError do
  "A RuntimeError occured"
end
Run Code Online (Sandbox Code Playgroud)

如果您使用以下默认development环境运行此应用程序:

$ ruby foo.rb
Run Code Online (Sandbox Code Playgroud)

然后,您将获得Sinatra的默认错误页面。如果disable在示例中取消注释该行,error则将改为触发处理程序,显示包含“发生RuntimeError”的页面。另外,您也可以按照说明在非development预先设置的环境中运行该应用程序show_exception。您可以通过设置RACK_ENV环境变量来做到这一点:

$ RACK_ENV=production ruby foo.rb
Run Code Online (Sandbox Code Playgroud)

出于开发目的,设置RACK_ENVproduction当然不是正确的方法。使用disable :show_exceptions代替。您可以使用Sinatra自述文件中概述configure块来有条件地禁用环境设置。development

configure :development do
  disable :show_exceptions
end
Run Code Online (Sandbox Code Playgroud)

Sinatra有关配置的文档以及其他一些有用的设置都记录了这种行为。