在 sinatra 中隔离路由和控制器

Segregate routes and controller in sinatra

目前 Sinatra 控制器看起来像这样,

class UserController < Sinatra::Base
 get '/' do
  # code goes here
 end
end

我怎样才能让它像Rails

# routes.rb
 get '/user' => 'user_controller#index'

你可以做一个创建路由的方法。

看我做的例子:

require 'sinatra'

class UserController
  def index
    'UserController -> index!'
  end

  def posts
    'UserController -> posts!'
  end
end

def route_get(url, call)
  controller_class, method = call.split('#')
  controller_class = Object.const_get(controller_class)

  Sinatra::Base.get url do
    controller_class.new.send(method)
  end
end

route_get '/', 'UserController#index'
route_get '/users', 'UserController#index'
route_get '/users/posts', 'UserController#posts'

如果你愿意,你可以为HTTP做其他的方法。或者你可以传递其他参数。