如何从外部文件处理 Sinatra 中的错误?

How to handle errors in Sinatra from external file?

我正在尝试处理包含帮助程序模块的 Sinatra 应用程序中的错误。我试过这样做:

# application_controller.rb
require './application_helper'

class ApplicationController < Sinatra::Base
    helpers Sinatra::ApplicationHelper

end
# application_helper.rb

require 'sinatra/base'

module Sinatra
  module ApplicationHelper
    error StandardError do |e|
      handle_error 500, e
    end
  end

  helpers ApplicationHelper
end

但我无法让它工作,它引发了错误:

NoMethodError:
  undefined method `error' for Sinatra::ApplicationHelper:Module

如何在外部模块中使用 error

您需要在辅助模块上使用 define a registered method,而不是使用 helpers 方法。在这个方法中传递的参数是你的应用程序,你可以用它来配置错误,例如:

module Sinatra
  module ApplicationHelper

    def self.registered(app)
      app.error StandardError do |e|
        handle_error 500, e
      end
    end
  end

  register ApplicationHelper
end

然后在您的应用程序文件中使用 register 而不是 helpers:

class ApplicationController < Sinatra::Base
  register Sinatra::ApplicationHelper

end

您可能希望在注册扩展的同时添加一些助手,例如,在这种情况下,您可能希望在扩展中包含 handle_error 方法。为此,您可以在扩展模块中添加另一个辅助模块,并调用 app.helpers 将其包含在 registered.

module Sinatra
  module ApplicationHelper

    module Helpers
      def handle_error(code, error)
        #... Helper code here.
      end

      # Other helpers if needed.
    end

    def self.registered(app)
      app.error StandardError do |e|
        handle_error 500, e
      end

      # Include helpers at registration.
      app.helpers Helpers
    end
  end

  register ApplicationHelper
end