Можно ли написать корневой маршрут с расширением файла в Синатре? - PullRequest
0 голосов
/ 04 августа 2011

Я пишу JSON API с помощью Sinatra и разделяю различные ресурсы на Sinatra::Base классы с помощью команды map:

map('/people') { run Api::People }

В пределах Api::People, /people будет отображаться как корневой путь /. Я бы хотел, чтобы /people.json обрабатывался через Api::People - возможно ли это? Я не могу понять, как написать маршрут.

Ответы [ 2 ]

0 голосов
/ 09 августа 2011

Если вам нужна альтернатива DRYer:

%w(people people.json).each do |route|
  map('/' + route) { run Api::People }
end

или вы можете включить косую черту в массив, например %w(/path/to/api /path/to/api.json)

0 голосов
/ 04 августа 2011

Похоже, требуется второе сопоставление:

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

Дополнительным преимуществом является то, что все маршруты завершены, поэтому вам не нужно постоянно помнить, что на самом деле означает «/».

...