2011-01-13 14 views

risposta

27

Non fai includono con Sinatra. Utilizzi le estensioni insieme al registro .

I.e. costruire il vostro modulo in un file separato:

require 'sinatra/base' 

module Sinatra 
    module OtherRoutes 
    def self.registered(app) 
     app.get "/route1" do 
     ... 
     end 
    end 
    end 
    register OtherRoutes # for non modular apps, just include this file and it will register 
end 

E quindi registrare:

class Server < Sinatra::Base 
    register Sinatra::OtherRoutes 
    ... 
end 

In realtà non è chiaro dalla documentazione che questa è la strada da percorrere per le applicazioni non di base Sinatra. Spero che aiuti gli altri.

+0

Buono. Ho usato il tuo esempio qui: https://github.com/bridgeutopia/simple-sinatra-mvc – kgpdeveloper

+1

Perché devi registrarti due volte? –

+0

È necessario chiamare il registro solo dalle app modulari, poiché il registro nel file di percorso verrà aggiunto solo allo spazio dei nomi principale. – aledalgrande

7

Si potrebbe fare questo:

module OtherRoutes 
    def self.included(app) 
    app.get "/route1" do 
     ... 
    end 
    end 
end 

class Server < Sinatra::Base 
    include OtherRoutes 
    ... 
end 

differenza Ramaze, percorsi di Sinatra non sono metodi, e quindi non è possibile utilizzare il metodo di ricerca di Ruby concatenamento direttamente. Si noti che con questo non è possibile successivamente eseguire il patch-patch su OtherRoutes e fare in modo che le modifiche vengano riflesse in Server; questa è solo una volta una comodità per definire i percorsi.

6

Ebbene si può anche utilizzare il metodo mappa per mappare percorsi per le tue applicazioni Sinatra

map "/" do 
    run Rack::Directory.new("./public") 
end 

map '/posts' do 
    run PostsApp.new 
end 

map '/comments' do 
    run CommentsApp.new 
end 


map '/users' do 
    run UserssApp.new 
end 
+3

Una nota di avvertimento: la limitazione dei questo approccio è che la mappa accetta solo stringhe non accettate (nessuna regexp è consentita). – pithyless

+0

Questo sembra essere un ottimo modo per organizzare l'app, ma la limitazione di avere su stringhe è ancora lì? –

3

Solo i miei due centesimi:

my_app.rb:

require 'sinatra/base' 

class MyApp < Sinatra::Base 
    set :root, File.expand_path('../', __FILE__) 
    set :app_file, __FILE__ 
    disable :run 

    files_to_require = [ 
    "#{root}/app/helpers/**/*.{rb}", 
    "#{root}/app/routes/**/*.{rb}" 
    ] 

    files_to_require.each {|path| Dir.glob(path, &method(:require))} 
    helpers App::Helpers 
end 

app/itinerari/health.rb:

MyApp.configure do |c| 
    c.before do 
    content_type "application/json" 
    end 

    c.get "/health" do 
    { Ruby: "#{RUBY_VERSION}", 
     Rack: "#{Rack::VERSION}", 
     Sinatra: "#{Sinatra::VERSION}" 
    }.to_json 
    end 
end 

app/aiutanti/application.rb:

module App 
    module Helpers 
    def t(*args) 
     ::I18n::t(*args) 
    end 

    def h(text) 
     Rack::Utils.escape_html(text) 
    end 
    end 
end 

config.ru:

require './my_app.rb' 
3

preferisco l'uso di Sinatra-contrib gioiello di estendere Sinatra per la sintassi più pulita e spazio dei nomi condiviso

# Gemfile 
    gem 'sinatra', '~> 1.4.7' 
    gem 'sinatra-contrib', '~> 1.4.6', require: 'sinatra/extension' 

    # other_routes.rb 
    module Foo 
    module OtherRoutes 
     extend Sinatra::Extension 
     get '/some-other-route' do 
     'some other route' 
     end 
    end 
    end 

    # app.rb 
    module Foo 
    class BaseRoutes < Sinatra::Base 
     get '/' do 
     'base route' 
     end 

     register OtherRoutes 
    end 
    end 

sinata-contrib viene mantenuto a fianco del progetto di Sinatra

Problemi correlati