助手不使用模块化 Sinatra 应用程序

Helpers not working with a modular Sinatra app

我在 helpers 使用模块化 Sinatra 应用程序时遇到了一些问题。我有一个主控制器和其他一些继承自它的控制器。所以 / 映射到 Root/auth 映射到 Auth,等等

主模块:

require 'sinatra/base'
# Lots of other requires

# Helper
module Utils
  def test
    puts "Test helper"
    return 'test'
  end
end

# Main app
class Application < Sinatra::Base    
  helpers Utils

  # Lots of config
end

"Controllers"继承Application,喜欢:

class Root < Application

  get '/' do
    puts Utils # Exists
    puts Utils.test # Breaks

    # view() Defined directly in `Application`, runs slim
    view :index
  end

end

这导致:

NoMethodError at /

private method `test' called for Utils:Module

有点难过。有帮助吗?

嗯,看起来答案很简单。

当通过 helpers() 包含一个模块时,它的方法变得可用 method_name() 而不是 ModuleName.method_name()

所以在这种情况下,在 Root 和 slim 模板中,我需要做的就是调用 test()

使用 helpers 模块可以让路由中的代码直接使用其中的所有方法,而无需在其前面加上模块名称前缀。

你可以这样做:

get '/' do
  puts test

  # view() Defined directly in `Application`, runs slim
  view :index
end

你得到 private method `test' called for Utils:Module 而不是 undefined method `test' for Utils:Module 的原因是因为内核中已经有一个 test method,因此它可以作为私有方法在所有 类.