我想使用Sinatra创建一个简单的实验性MVC框架。
我想按名称"pages"
定义资源,例如应解析为:
/pages (index)
/pages/new
/pages/:id/show (show)
正如映射到app/controllers/PagesController.rb
并且对应get('/')
负责索引,post('/pages/create')
负责创建等。
麻烦甚至在阅读官方文档后我非常困惑。我想我需要使用非经典的Sinatra模型,但有人能指出我正确的方向吗?
谢谢
答案 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