如何将路线映射到Sinatra的控制器?

dsp*_*099 1 ruby model-view-controller routing sinatra

我想用Sinatra创建一个简单的实验性MVC框架.

我想按名称定义资源"pages",例如应该解决:

/pages (index)
/pages/new
/pages/:id/show (show)
Run Code Online (Sandbox Code Playgroud)

如同映射到app/controllers/PagesController.rb对应get('/')负责索引,post('/pages/create')负责创建等.

在阅读官方文档之后,我甚至感到非常困惑.我想我需要使用非经典的Sinatra模型,但有人能指出我正确的方向吗?

谢谢

pho*_*zed 5

如果你想要我认为你想要的东西,我会一直这样做.最初对于这个方案我使用travis-api源作为参考,但基本上你想要做的是在一个"控制器"类中扩展Sinatra :: Base,然后在机架中安装你的个人Sinatra"控制器",像这样:

module Endpoint
  def self.included(base)
    base.class_eval do
      set(:prefix) { "/" << name[/[^:]+$/].downcase }
    end
  end
end

class Users < Sinatra::Base
  include Endpoint

  get '/' do
    #logic here
  end

  get '/:id' do
    #logic here
  end

  post '/' do
    #logic here
  end

  patch '/:id' do
    #logic here
  end
end

class Posts < Sinatra::Base
  include Endpoint

  post '/' do
    #logic here
  end
end
Run Code Online (Sandbox Code Playgroud)

然后这样的事情:

class App
  require "lib/endpoints/users"
  require "lib/endpoints/posts"

  attr_reader :app

  def initialize
    @app = Rack::Builder.app do
      [Users, Posts].each do |e|
        map(e.prefix) { run(e.new) }
      end
    end
  end

  def call(env)
    app.call(env)
  end
end
Run Code Online (Sandbox Code Playgroud)

你可以根据需要调整它,但想法是一样的,你将你的应用程序分成可组合的Sinatra应用程序,每个应用程序都有一个使用Rack安装的前缀.这个特殊的例子将为您提供以下路线:

得到'/ users'

获取'/ users /:id'

发布'/ users'

补丁'/ users /:id'

得到'/帖子'

  • 你能解释一下`self.included(base)`来自哪里以及它究竟做了什么?谢谢 (2认同)