【问题标题】:Rendering 404 in sinatra if file not found如果找不到文件,则在 sinatra 中呈现 404
【发布时间】:2013-11-15 20:36:08
【问题描述】:

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

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

【问题讨论】:

    标签: ruby routing sinatra


    【解决方案1】:

    你可以这样做:

    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
    • 查看requested_erb = File.join(root, 'pages', params[:page]) 返回的内容 - 这可能不是 100% 正确的。
    【解决方案2】:

    试试这个;)

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

    用你喜欢的任何名称为自己创建一个 404 页面(例如,我的是 oops.erb),这应该可以正常工作。

    not_foundSinatra 的 错误处理助手,用于抓取它返回的错误 500 和 404 未发现。然后,您可以使用它更改 HTTP 状态和相应的视图。 Check out the documentation 对于 Sinatra 的所有错误处理程序:它们非常有用!

    【讨论】:

    • 如果你按照 Jordan 的建议使用 halt(404)not_found 将被自动调用(你甚至不需要指定 status 指令)。
    • 但是,请注意,根据我的经验 - 与原始答案的建议相反 - not_found 仅捕获 404。 500s 甚至 4xx 类中的其他错误都不会调用它。
    猜你喜欢
    • 1970-01-01
    • 2018-07-02
    • 2021-10-11
    • 1970-01-01
    • 2019-12-27
    • 2017-07-12
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    相关资源
    最近更新 更多