Похоже, требуется второе сопоставление:
map('/people') { run Api::People }
map('/people.json') { run Api::People }
Когда я добавляю это, /people.json
отправляется в корневой путь Api::People
, как я хотел.
Проблема с этим подходом заключается в том, что у меня много вложенных ресурсов, которые преобразуются в много повторяющихся отображений.
Я остановился на элегантном и логичном дизайне.последовательны.Знаете ли вы, что Sinatra::Base
класс может монтировать другие Sinatra::Base
классы внутри себя как связующее ПО?
Как только я это выяснил, решение очевидно:
config.ru
Dir['api/**/*.rb'].each {|file| require file }
run API::Router
API / router.rb
module API
class Router < Sinatra::Base
use Businesses
use People
use Users
get '*' do
not_found
end
end
end
API / Enterprises.rb
class API::Businesses < Sinatra::Base
use Locations
get '/businesses.json' do ... end
get '/businesses/:id.json' do ... end
end
api / business / location.rb
class API::Businesses < Sinatra::Base
class Locations < Sinatra::Base
before { @business = Business.find_by_id( params[:business_id] ) }
get '/businesses/:business_id/locations.json' do ... end
get '/businesses/:business_id/locations/:id.json' do ... end
end
end
Дополнительным преимуществом является то, что все маршруты завершены, поэтому вам не нужно постоянно помнить, что на самом деле означает «/».