【问题标题】:Route Handlers Inside a Class类中的路由处理程序
【发布时间】:2016-02-26 10:01:40
【问题描述】:

我有一个 Sinatra 应用设置,其中大部分逻辑在各种类中执行,post/get 路由实例化这些类并调用它们的方法。

我正在考虑将post/get 路由处理程序放在类本身内部是否会是一个更好的结构。

无论如何,我想知道这是否可能。比如:

class Example
  def say_hello
    "Hello"
  end

  get '/hello' do
    @message = say_hello
  end
end

如果不修改上述内容,Sinatra 会说SinatraApplication 对象上没有方法say_hello

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    你只需要从Sinatra::Base继承:

    require "sinatra/base"
    
    class Example < Sinatra::Base
      def say_hello
        "Hello"
      end
    
      get "/hello" do
        say_hello
      end
    end
    

    您可以使用Example.run! 运行您的应用程序。


    如果您需要在应用程序的各个部分之间进行更多分离,只需制作另一个 Sinatra 应用程序。将共享功能放入模型类和助手中,并与 Rack 一起运行您的所有应用程序。

    module HelloHelpers
      def say_hello
        "Hello"
      end
    end
    
    class Hello < Sinatra::Base
      helpers HelloHelpers
    
      get "/?" do
        @message = say_hello
        haml :index
      end
    end
    
    class HelloAdmin < Sinatra::Base
      helpers HelloHelpers
    
      get "/?" do
        @message = say_hello
        haml :"admin/index"
      end
    end
    

    config.ru:

    map "/" do
      run Hello
    end
    
    map "/admin" do
      run HelloAdmin
    end
    

    安装Thin,并使用thin start 运行您的应用。

    【讨论】:

    • 谢谢!我的目标基本上是创建多个控制器。我不确定如何以这种方式最好地做到这一点——因为在使用 run 方法时,一个类作为整个应用程序运行?有什么建议吗?
    • 刚刚更新了我的答案以包含一个示例,说明您可以将应用程序拆分为多个类。
    【解决方案2】:

    您可能想使用Sinatra Helpers

    【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-02-27
    • 2016-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多