2011-01-13 14 views

Odpowiedz

27

Nie rób obejmują z Sinatry. Używasz rozszerzeń razem z rejestrem rejestru.

tj. budować swój moduł w oddzielnym pliku:

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 

A potem zarejestrować:

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

To naprawdę nie wynika z docs, że jest to droga do nie-podstawowych aplikacji Sinatra. Mam nadzieję, że pomaga innym.

+0

Dobra. Użyłem twojego przykładu tutaj: https://github.com/bridgeutopia/simple-sinatra-mvc – kgpdeveloper

+1

Dlaczego musisz się zarejestrować dwa razy? –

+0

Musisz wywołać rejestr tylko z aplikacji modułowych, ponieważ rejestr w pliku trasy doda tylko do głównej przestrzeni nazw. – aledalgrande

7

Można to zrobić:

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

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

przeciwieństwie ramaze trasy Sinatry nie są metodami, a więc nie można użyć Ruby metoda łączenia odnośnika bezpośrednio. Zauważ, że dzięki temu nie będziesz mógł później łatać małpek OtherRoutes i mieć zmiany odzwierciedlone na Serwerze; jest to tylko jednorazowa wygoda w definiowaniu tras.

6

Cóż można również użyć metody mapami tras do Sinatra aplikacji

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

Uwaga ostrzeżenia: ograniczenie podejście to polega na tym, że mapa akceptuje tylko nieprzetworzone ciągi (nie można stosować wyrażeń regularnych). – pithyless

+0

Wydaje się to być świetnym sposobem na zorganizowanie aplikacji, ale czy jest to ograniczenie posiadania wciąż dostępnych ciągów? –

3

Tylko moje dwa centy:

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/Trasy/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/pomocników/environment.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

wolę korzystania z Sinatra-contrib gem przedłużenia Sinatrę dla czystszego składni i nazw udostępnionego

# 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 prowadzony jest obok Sinatry projektu

Powiązane problemy