如果文件未找到,在Sinatra中呈现404错误页面

12

我有一个基本的Sinatra应用程序,它从目录中呈现文件。我想要的是如果页面不存在,则返回404。目前它会引发500错误。

get '/:page' do
  erb :"pages/#{params[:page]}", layout: :"layouts/application"
end
2个回答

25

试一下这个 ;)

# 404 Error!
not_found do
  status 404
  erb :oops
end

你可以使用任意想要的名称(例如我的是oops.erb)来制作自己的404页面,这应该能正常工作。

not_foundSinatra的错误处理助手,用于捕获返回的500s和404未找到的错误。然后,您可以使用它更改HTTP状态和相应的视图。查看文档以获取有关Sinatra所有错误处理程序的信息:它们非常有用!


3
另外,请查看Sinatra的halt - Jordan Thornquest
3
如果按照Jordan的建议使用halt(404)not_found函数将会自动被调用(而且你甚至都不需要指定status指令)。 - Alessandro
2
然而,需要注意的是,根据我的经验 - 与原始答案所暗示的相反 - not_found 只能捕获404错误。它不会被调用来处理500或甚至4xx类中的其他错误。 - Alessandro

2
你可以尝试这样做:

你可以这样操作:

get '/:page' do
  requested_erb = File.join(root, 'pages', params[:page])

  pass unless File.exists?(requested_erb)

  erb :"#{requested_erb}", :layout: :"layouts/application"
end

我还没有测试过这个代码,所以可能会有一些问题,但这是我头脑中的大致思路。

很遗憾,所有页面现在都会引发404错误。 - olimart
检查一下 requested_erb = File.join(root, 'pages', params[:page]) 返回的内容 - 这可能不是100%正确的。 - CDub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接