Как смешивать маршруты в Синатре для лучшей структуры
Я не нашел ничего о том, как я могу смешивать маршруты из другого модуля, например:
module otherRoutes
get "/route1" do
end
end
class Server < Sinatra::Base
include otherRoutes
get "/" do
#do something
end
end
Возможно ли это?
Ответы
Ответ 1
Вы не включаете в себя Sinatra. Вы используете расширения вместе с регистром.
т.е. создайте свой модуль в отдельном файле:
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. Надеюсь, это поможет другим.
Ответ 2
Вы можете сделать это:
module OtherRoutes
def self.included( app )
app.get "/route1" do
...
end
end
end
class Server < Sinatra::Base
include OtherRoutes
...
end
В отличие от Ramaze, маршруты Sinatra не являются методами и поэтому не могут напрямую использовать цепочку поиска Ruby. Обратите внимание, что с этим вы не можете позже обезьян-патчем OtherRoutes и иметь изменения, отраженные в Server; это просто одноразовое удобство для определения маршрутов.
Ответ 3
Ну, вы также можете использовать метод 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
Ответ 4
Только мои два цента:
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'
Ответ 5
Я предпочитаю использовать sinatra-contrib gem для расширения синатра для более чистого синтаксиса и совместного пространства имен
# 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 поддерживается рядом с проектом синатра