似乎在 Sinatra 中,所有路由处理程序都被写入单个文件,如果我理解正确,它充当一个大/小控制器。有没有办法将它拆分为单独的独立文件,所以当我们说有人调用“/”时 - 执行一个动作,如果收到类似“/posts/2”的smth然后另一个动作 - 类似的逻辑在PHP中应用?
这是我使用的 Sinatra 应用程序的基本模板。(我的大型应用程序有 200 多个像这样分解的文件,不包括供应商的 gem,涵盖 75-100 条显式路由。其中一些路由是覆盖额外 50 多个路由模式的正则表达式路由。)使用 Thin 时,您运行像这样的应用程序使用: thin -R config.ru start
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 helpers/ init.rb partials.rb models/ init.rb user.rb routes/ init.rb login.rb main.rb views/ layout.haml login.haml main.haml
配置.ru
root = ::File.dirname(__FILE__) require ::File.join( root, 'app' ) run MyApp.new
应用程序.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'
听 助手/init.rb
# encoding: utf-8 require_relative 'partials' MyApp.helpers PartialPartials require_relative 'nicebytes' MyApp.helpers NiceBytes
帮助者 /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
帮助者 /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
听 意见/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= yield