如果找不到文件,则在sinatra中渲染404

oli*_*art 11 ruby routing sinatra

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

get '/:page' do
  erb :"pages/#{params[:page]}", layout: :"layouts/application"
end
Run Code Online (Sandbox Code Playgroud)

Jor*_*est 21

试试这个 ;)

# 404 Error!
not_found do
  status 404
  erb :oops
end
Run Code Online (Sandbox Code Playgroud)

用自己喜欢的名字(oops.erb例如我的名字)制作一个404页面,这应该可以正常工作.

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

  • 另外,[查看Sinatra的"停止"](http://myronmars.to/n/dev-blog/2012/01/why-sinatras-halt-is-awesome). (3认同)
  • 如果使用Jordan建议的`halt(404)`,则会自动调用`not_found`(你甚至不需要指定`status`指令). (3认同)
  • 但请注意,根据我的经验 - 与原始答案所暗示的相反 - "not_found"仅捕获404.它不会被调用500s甚至4xx类中的其他错误. (2认同)

CDu*_*Dub 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
Run Code Online (Sandbox Code Playgroud)

我还没有对此进行测试,因此上面的代码可能存在一些问题,但这是我脑海中的总体想法。