Answers:
这是我使用的Sinatra应用程序的基本模板。(我的大型应用程序有200多个这样分解的文件,不包括供应商提供的gem,涵盖75-100条明确的路由。其中某些路由是Regexp路由,涵盖了另外50多种路由模式。)使用Thin时,请运行这样的应用程序使用:
thin -R config.ru start
编辑:我现在根据以下称为Riblits的方式维护自己的Monk骨架。要使用它复制我的模板作为您自己的项目的基础,请执行以下操作:
# Before creating your project
monk add riblits git://github.com/Phrogz/riblits.git
# Inside your empty project directory
monk init -s riblits文件布局:
config.ru app.rb 助手/ 初始化文件 partials.rb 楷模/ 初始化文件 user.rb 路线/ 初始化文件 login.rb main.rb 观看次数/ layout.haml login.haml Main.haml
 
config.ru
root = ::File.dirname(__FILE__)
require ::File.join( root, 'app' )
run MyApp.new 
app.rb
# encoding: utf-8
require 'sinatra'
require 'haml'
class MyApp < Sinatra::Application
  enable :sessions
  configure :production do
    set :haml, { :ugly=>true }
    set :clean_trace, true
  end
  configure :development do
    # ...
  end
  helpers do
    include Rack::Utils
    alias_method :h, :escape_html
  end
end
require_relative 'models/init'
require_relative 'helpers/init'
require_relative 'routes/init' 
helpers / init.rb
# encoding: utf-8
require_relative 'partials'
MyApp.helpers PartialPartials
require_relative 'nicebytes'
MyApp.helpers NiceBytes 
helpers / partials.rb
# encoding: utf-8
module PartialPartials
  def spoof_request(uri,env_modifications={})
    call(env.merge("PATH_INFO" => uri).merge(env_modifications)).last.join
  end
  def partial( page, variables={} )
    haml page, {layout:false}, variables
  end
end 
helpers / nicebytes.rb
# encoding: utf-8
module NiceBytes
  K = 2.0**10
  M = 2.0**20
  G = 2.0**30
  T = 2.0**40
  def nice_bytes( bytes, max_digits=3 )
    value, suffix, precision = case bytes
      when 0...K
        [ bytes, 'B', 0 ]
      else
        value, suffix = case bytes
          when K...M then [ bytes / K, 'kiB' ]
          when M...G then [ bytes / M, 'MiB' ]
          when G...T then [ bytes / G, 'GiB' ]
          else            [ bytes / T, 'TiB' ]
        end
        used_digits = case value
          when   0...10   then 1
          when  10...100  then 2
          when 100...1000 then 3
          else 4
        end
        leftover_digits = max_digits - used_digits
        [ value, suffix, leftover_digits > 0 ? leftover_digits : 0 ]
    end
    "%.#{precision}f#{suffix}" % value
  end
  module_function :nice_bytes  # Allow NiceBytes.nice_bytes outside of Sinatra
end 
型号/init.rb
# encoding: utf-8
require 'sequel'
DB = Sequel.postgres 'dbname', user:'bduser', password:'dbpass', host:'localhost'
DB << "SET CLIENT_ENCODING TO 'UTF8';"
require_relative 'users' 
型号/user.rb
# encoding: utf-8
class User < Sequel::Model
  # ...
end 
路由/init.rb
# encoding: utf-8
require_relative 'login'
require_relative 'main' 
路由/login.rb
# encoding: utf-8
class MyApp < Sinatra::Application
  get "/login" do
    @title  = "Login"
    haml :login
  end
  post "/login" do
    # Define your own check_login
    if user = check_login
      session[ :user ] = user.pk
      redirect '/'
    else
      redirect '/login'
    end
  end
  get "/logout" do
    session[:user] = session[:pass] = nil
    redirect '/'
  end
end 
路由/main.rb
# encoding: utf-8
class MyApp < Sinatra::Application
  get "/" do
    @title = "Welcome to MyApp"        
    haml :main
  end
end 
views / layout.haml
!!! XML
!!! 1.1
%html(xmlns="http://www.w3.org/1999/xhtml")
  %head
    %title= @title
    %link(rel="icon" type="image/png" href="/favicon.png")
    %meta(http-equiv="X-UA-Compatible" content="IE=8")
    %meta(http-equiv="Content-Script-Type" content="text/javascript" )
    %meta(http-equiv="Content-Style-Type" content="text/css" )
    %meta(http-equiv="Content-Type" content="text/html; charset=utf-8" )
    %meta(http-equiv="expires" content="0" )
    %meta(name="author" content="MeWho")
  %body{id:@action}
    %h1= @title
    #content= yieldArray该类是由核心库定义的,但是您以后可以使用class Array; def some_awesome_method; end和“ a” 保留所有以前的Array功能,并且b)所有Array实例将获取新代码。Ruby中的类只是对象,可以随时进行扩充和更改。
                    绝对。要查看此示例,我建议下载Monk gem,如下所述:
https://github.com/monkrb/monk
您可以通过rubygems.org“安装”它。掌握宝石后,请按照上面的说明生成示例应用。
请注意,除非您愿意,否则不必在实际开发中使用Monk(实际上,我认为可能不是最新的)。关键是要了解如何根据需要轻松地以MVC样式(带有单独的类似控制器的路由文件)构建应用程序。
如果您查看Monk的处理方式,则非常简单,主要是需要将文件放在单独的目录中,例如(您必须定义root_path):
Dir[root_path("app/**/*.rb")].each do |file|
    require file
endinit.rb与上述方法相比,一件好事是,如果您有相互依赖的文件,则可以控制加载顺序。
                    在Google上搜索“ Sinatra样板”,以了解其他人如何布置他们的Sinatra应用程序。由此,您可能会找到适合您需求的产品,也可以简单地制造自己的产品。这并不难。随着开发更多Sinatra应用程序,您可以将其添加到样板中。
这是我为所有项目制作和使用的内容:
我知道这是一个古老的查询,但是我仍然不敢相信没有人提到Padrino。您可以将其用作Sinatra之上的框架,也可以零碎地仅添加您感兴趣的宝石。它踢了十屁股的屁股!
我在同一站点上托管不同项目的方法是sinatra/namespace按以下方式使用:
server.rb
require "sinatra"
require "sinatra/namespace"
if [ENV["LOGNAME"], ENV["USER"]] == [nil, "naki"]
    require "sinatra/reloader"
    register Sinatra::Reloader
    set :port, 8719
else
    set :environment, :production
end
for server in Dir.glob "server_*.rb"
    require_relative server
end
get "/" do
    "this route is useless"
endserver_someproject.rb
module SomeProject
    def self.foo bar
       ...
    end
    ...
end
namespace "/someproject" do
    set :views, settings.root
    get "" do
        redirect request.env["REQUEST_PATH"] + "/"
    end
    get "/" do
        haml :view_someproject
    end
    post "/foo" do
        ...
        SomeProject.foo ...
    end
endview_someproject.haml
!!!
%html
    ...关于我使用的子项目的另一个细节是将它们的名称,描述和路由添加到某种全局变量中,该变量用于"/"创建指南主页,但是我现在没有摘录。
在此处阅读文档:
看起来Sinatra允许您将应用程序分解为Ruby模块,可以通过Sinatra的“ register”方法或“ helpers”方法将其插入,如下所示:
require 'sinatra/base'
module Sinatra
  module Sample
    module Helpers
      def require_logged_in()
        redirect('/login') unless session[:authenticated]
      end
    end
  end
endrequire 'sinatra/base'
module Sinatra
  module Sample
    module Routing
      module Foos
        def self.registered(app)           
          app.get '/foos/:id' do
            # invoke a helper
            require_logged_in
            # load a foo, or whatever
            erb :foos_view, :locals => { :foo => some_loaded_foo }
          end   
        end  
      end
    end     
  end
end#!/usr/bin/env ruby
require 'sinatra'
require_relative 'routing/foos'
class SampleApp < Sinatra::Base
  helpers Sinatra::Sample::Helpers
  register Sinatra::Sample::Routing::Foos
end当Monk不适合我工作时,我自己开始研究模板。
如果您考虑一下,那么捆绑一组文件并没有什么特别的。僧侣哲学是在2011年初RedDotRubyConf上向我解释的,他们特别告诉我,使用它确实是可选的,尤其是在几乎没有维护的情况下。
对于那些想使用ActiveRecord的人来说,这是一个好的开始:
简单的Sinatra MVC
大型项目在Sinatra上实现模块化的关键是学习使用基础工具。
SitePoint有一个很好的教程,您可以从中看到模块化的Sinatra应用程序和助手。但是,您应该特别注意一个重要的细节。您保留了多个Sinatra应用程序,并通过Rackup进行安装。在您知道如何编写基本应用程序之后,请查看该教程的config.ru文件,并观察它们如何安装独立的Sinatra应用程序。
一旦您学会了如何在Rack上运行Sinatra,就会打开一个全新的模块化策略世界。显然,这会邀请您尝试一些真正有用的东西:现在,您可以依靠每个子应用程序具有单独的Gems ,这可以使您轻松地对模块进行版本控制。
不要低估为您的应用程序使用gem模块的功能。您可以在界限分明的环境中轻松测试实验性更改,并轻松部署它们。同样,如果出现问题,也很容易还原。
有上千种方法来组织代码,因此尝试获得类似于Rails的布局也不会受到损害。但是,也有一些很棒的文章介绍了如何自定义自己的结构。该帖子涵盖了大多数Web开发人员的其他常见需求。
如果有时间,我鼓励您学习有关Rack的更多信息,Rack是任何基于Ruby的Web应用程序的共同点。它对您的工作方式的影响可能要小得多,但是大多数人在他们的应用程序上总是执行某些任务,这些任务更适合作为Rack中间件。
require "sequel"和DB初始化models/init.rb,并require_relative用于所有文件-您可以将CD放入models目录,打开IRB控制台并键入require './init',然后加载完整的数据库和模型设置以进行交互式探索。