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

时间:2015-05-24 09:29:57

标签: ruby model-view-controller routing sinatra

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

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

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

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

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

谢谢

3 个答案:

答案 0 :(得分: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

然后是这样的:

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'

patch'/ users /:id'

获取'/ posts'

答案 1 :(得分:0)

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

创建文件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

答案 2 :(得分:0)

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

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