【问题标题】:Sinatra: How to set namespace for base classSinatra:如何为基类设置命名空间
【发布时间】:2016-03-11 11:03:27
【问题描述】:

如何组织控制器层次结构,以便得到这样的东西:

class ApplicationController < Sinatra::Application
  set :namespace, '/api' # ???
end

class UsersController < AplicationController
  namespace '/users' do
    # /api/users/show
    get '/show' do
      # blablabla
    end
  end
end

class PostsController < ApplicationController
  namespace '/posts' do
    # /api/posts/show
    get '/posts' do
      # blablabla
    end
  end
end

我主要使用 Rails,但不知道在 Sinatra 中是否可行。

【问题讨论】:

    标签: ruby sinatra


    【解决方案1】:

    你只需要换一个字:

    class ApplicationController < Sinatra::Base
    

    来自Sinatra Up and Running

    路由继承 不仅是设置,还有 Sinatra 的各个方面 类将被其子类继承。这包括定义的 路由、所有错误处理程序、扩展、中间件等。 但最重要的是,它将像方法一样被继承 遗传。如果您应该在拥有之后为一个类定义一个路由 该类的子类,该路线也将在 子类。

    如果您正在寻找 HTML 路由排序的命名空间,而不仅仅是 Ruby 排序,那么请查看包含 Sinatra 命名空间的 Sinatra Contrib

    如果您确实使用 Sinatra 命名空间,您可能需要再更改一个词:

    class PostsController < ApplicationController
      namespace '/posts' do
        # /api/posts/show
        get '/' do # otherwise the route would be /posts/posts
          # blablabla
        end
      end
    end
    

    【讨论】:

    • 我应该如何用全局命名空间定义ApplicationController?
    • 通过全局命名空间,你的意思是你在 ApplicationController 中有一个类似 "/api/v1" 的路由,并且从它继承的所有东西也会在它的路由前加上 "/api/v1" ?
    • 在我看来,最好的方法是use Rack map。使用 Sinatra 命名空间来扩展它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-08
    • 2012-07-23
    • 2014-12-31
    • 1970-01-01
    • 2011-02-21
    • 2011-10-12
    相关资源
    最近更新 更多