Как смешать маршруты в Синатре для лучшей структуры - PullRequest
20 голосов
/ 13 января 2011

Я ничего не нашел о том, как я могу смешивать маршруты из другого модуля, например:

module otherRoutes
  get "/route1" do

  end
end    

class Server < Sinatra::Base
  include otherRoutes

  get "/" do
    #do something
  end
end

Возможно ли это?

Ответы [ 5 ]

28 голосов
/ 27 июля 2011

Вы не делаете , включая с Синатрой. Вы используете расширения вместе с register .

т.е. соберите свой модуль в отдельный файл:

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

А затем зарегистрируйтесь:

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

Из документов не совсем понятно, что это путь для неосновных приложений Sinatra. Надеюсь, что это помогает другим.

7 голосов
/ 14 января 2011

Вы можете сделать это:

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

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

В отличие от Ramaze, маршруты Синатры не являются методами, и поэтому не могут напрямую использовать цепочку поиска методов Руби. Обратите внимание, что в этом случае вы не сможете позже исправить другие исправления и отразить изменения на сервере; это всего лишь одноразовое удобство для определения маршрутов.

6 голосов
/ 10 марта 2011

Ну, вы также можете использовать метод map для отображения маршрутов к вашим приложениям 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 голосов
/ 24 февраля 2016

Я предпочитаю использовать гем sinatra-contrib для расширения sinatra для более чистого синтаксиса и общего пространства имен

  # 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 поддерживается вместе с проектом sinatra

3 голосов
/ 09 октября 2012

Только мои два цента:

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

приложение / маршруты / 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

приложение / хелперы / 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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...