Как правильно настроить config.ru в модульном приложении Синатра.? - PullRequest
6 голосов
/ 08 марта 2012

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

class MyApp < Sinatra::Base
  get '/' 
  end

  ...
end

class AnotherRoute < MyApp
  get '/another'
  end

  post '/another'
  end
end
run Rack::URLMap.new \ 
  "/"       => MyApp.new,
  "/another" => AnotherRoute.new

В config.ru я понимаю, что это только для "GET", как насчет других ресурсов (например, "PUT", "POST")? Я не уверен, что мне не хватает очевидного. А также, если у меня есть десять путей (/ path1, / path2, ...), нужно ли мне настраивать их все в config.ru, даже если они находятся в одном классе?

Ответы [ 3 ]

15 голосов
/ 08 апреля 2012

app.rb

class MyApp < Sinatra::Base
  get '/' 
  end
end

app2.rb Если вы хотите два отдельных файла. Обратите внимание, что это наследуется от Sinatra :: Base, а не MyApp.

class AnotherRoute < Sinatra::Base
  get '/'
  end

  post '/'
  end
end

Конфиг.ру

require 'bundler/setup'
Bundler.require(:default)

require File.dirname(__FILE__) + "/lib/app.rb"
require File.dirname(__FILE__) + "/lib/app2.rb"


map "/" do
    run MyApp
end

map "/another" do
    run AnotherRoute
end
5 голосов
/ 08 марта 2012

Вы можете написать это как

class MyApp < Sinatra::Base
  get '/' 
  end
  get '/another'
  end

  post '/another'
  end
end

в config.ru

require './my_app'
run MyApp

Пробег:

rackup -p 1234

См. Документацию на http://www.sinatrarb.com/intro#Serving%20a%20Modular%20Application

4 голосов
/ 08 марта 2012

С помощью URLMap вы указываете базовый URL, где должно быть установлено приложение. Путь, указанный на карте, не используется при определении того, какой маршрут использовать в самом приложении. Другими словами, приложение действует так, как если бы его корневой каталог был после пути, используемого в URLMap.

Например, ваш код будет отвечать на следующие пути:

  • /: будет перенаправлен на маршрут / в MyApp

  • /another: пойдет по маршруту / в AnotherRoute. Поскольку AnotherRoute extends MyApp, это будет то же самое, что и / в MyApp (но в другом случае).

    URLMap видит /another и использует его для сопоставления с AnotherRoute, удаляя эту часть запроса с пути. AnotherRoute тогда видит только /.

  • /another/another: будет перенаправлен на два /another маршрута в AnotherRoute. Опять же, первый another используется URLMap для направления запроса на AnotherRoute. AnotherRoute тогда видит только второй another как путь.

    Обратите внимание, что этот путь будет отвечать на запросы GET и POST, каждый из которых обрабатывается соответствующим блоком.

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

run AnotherRoute.new

Поскольку AnotherRoute расширяет MyApp, для него будет определен маршрут /.

Если вы ищете способ добавления маршрутов к существующему приложению Sinatra, вы можете создать модуль с included методом, который добавляет маршруты вместо использования наследования.

...