当服务器上出现错误(例如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_ENV为production当然不是正确的方法。使用disable :show_exceptions代替。您可以使用Sinatra自述文件中概述的configure块来有条件地禁用环境设置。development
configure :development do
disable :show_exceptions
end
Run Code Online (Sandbox Code Playgroud)
Sinatra有关配置的文档以及其他一些有用的设置都记录了这种行为。