2011-01-13 17 views

Trả lời

27

Bạn không làm bao gồm với Sinatra. Bạn sử dụng các tiện ích mở rộng cùng với đăng ký.

I.e. xây dựng mô-đun của bạn trong một file riêng biệt:

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 

Và sau đó đăng ký:

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

Nó không thực sự rõ ràng từ các tài liệu rằng đây là con đường để đi cho các ứng dụng Sinatra không cơ bản. Hy vọng nó sẽ giúp người khác.

+0

Tốt nhất. Tôi đã sử dụng ví dụ của bạn ở đây: https://github.com/bridgeutopia/simple-sinatra-mvc – kgpdeveloper

+1

Tại sao bạn cần phải đăng ký hai lần? –

+0

Bạn chỉ cần đăng ký từ các ứng dụng mô-đun, vì đăng ký trong tệp tuyến đường sẽ chỉ thêm vào không gian tên chính. – aledalgrande

7

Bạn có thể làm điều này:

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

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

Không giống như Ramaze, các tuyến đường Sinatra không phương pháp, và do đó không thể sử dụng tra cứu phương pháp Ruby chaining được kết trực tiếp. Lưu ý rằng với điều này, bạn không thể cập nhật bản vá lỗi OtherRoutes và có các thay đổi được phản ánh trong Máy chủ; đây chỉ là tiện ích một lần để xác định các tuyến đường.

6

Vâng, bạn cũng có thể sử dụng phương pháp bản đồ để lập bản đồ các tuyến đường cho các ứng dụng của bạn 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

Một lưu ý cảnh báo: những hạn chế của cách tiếp cận này là bản đồ chỉ chấp nhận các chuỗi thô (không cho phép regexp). – pithyless

+0

Điều này có vẻ là một cách tuyệt vời để tổ chức ứng dụng, nhưng là giới hạn của việc có chuỗi vẫn còn đó? –

3

Chỉ cần tôi hai xu:

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/tuyến/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/giúp đỡ/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

Tôi thích việc sử dụng Sinatra-contrib đá quý để mở rộng Sinatra cho cú pháp sạch hơn và không gian tên chia sẻ

# 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 được duy trì cùng với các dự án Sinatra

Các vấn đề liên quan