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

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

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

 /pages (index) /pages/new /pages/:id/show (show) 

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

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

谢谢

如果你想要我认为你想要的东西,我会一直这样做。 最初对于这个方案我使用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 

然后这样的事情:

 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 

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

获得'/ users'

获取'/ users /:id'

发布'/ users'

补丁'/ users /:id'

得到'/post'

我在这里给你一个非常简单的例子:

创建一个文件controller.rb

 get '/pages' do @pages = Pages.all erb :pages end 

接下来,在与控制器相同的文件夹中创建一个views目录,并创建一个名为pages.html.erb的文件

这是您先前创建的控制器操作的相应视图。

在这里,您可以键入以下内容:

 <% @pages.each do |p| %> <%= p.title %> <% end %> 

重新启动服务器,访问localhost:PORT/pages ,您将看到所有页面标题的列表。

您可以查看此链接以获取简单的sinatra教程 – http://code.tutsplus.com/tutorials/singing-with-sinatra–net-18965

您可以根据需要使其变得复杂或简单。 例如:

Rails让很多魔术发生在幕后,而Sinatra则更加灵活,但要求你自己实现这些东西。

 controller_map = { 'pages' => PagesController } post '/:controller/new' do c = params[:controller] module = controller_map[c] module.create_new() ... end get '/:controller/:id/show' do c = params[:controller] id = params[:id] module = controller_map[c] module.get(id) ... end