Почему ‘/’ правильно соответствует приложению Rack в моем приложении Rails 3, но ни один другой маршрут не соответствует?

#ruby-on-rails #ruby #routing

#ruby-on-rails #ruby #маршруты

Вопрос:

Я использую Rails 3.0.6.

В моем каталоге lib у меня есть example_app.rb, который является просто приложением Sinatra:

 class ExampleApp < Sinatra::Base
  get '/' do
    "Hello from Sinatra"
  end
end
  

И я загружаю его автоматически с помощью конфигурации application.rb config.auto_load_paths.

В моем файле routes у меня есть только:

 match "/" => ExampleApp
  

И это прекрасно соответствует, когда я запускаю сервер rails (Webrick). Однако, если я попытаюсь:

 match "/example" => ExampleApp
  

Посещение localhost: 3000 / example выдает ошибку «Маршрут не соответствует «/ example»». Запуск rake routes показывает маршрут, хотя:

 example  /example(.:format) {:to=>ExampleApp}
  

Если я попытаюсь сопоставить ‘ / example’ с действием контроллера, это сработает нормально, но не с тем приложением Sinatra, которое указано выше, поэтому я не уверен, что происходит. Я знаю, что мне не хватает чего-то небольшого, чего я не нахожу в документации по маршрутизации на сайте Rails.

Спасибо за любую помощь.

Ответ №1:

Проблема в том, что ваше приложение Sinatra отвечает только на запросы, сделанные в / . Вам нужно либо добавить

 get '/example'
  

или сопоставьте подстановочный знак, используя *

 get '*' do
  "Hello from Sinatra"
end
  

Комментарии:

1. Я по-прежнему получаю ошибку «Маршрут не совпадает», если я меняю свой маршрут Sinatra на соответствующий ‘/ example’. Кроме того, это, похоже, противоречит сообщению в блоге, которое я прочитал на yehudakatz.com/2009/12/26/the-rails-3-router-rack-it-up какой ‘ / home’, используемый в качестве примера в маршруте Rails 3, должен хорошо соответствовать приложению Sinatra с простым маршрутом ‘/’.

2. Я только что создал новое приложение и попробовал это. Примеры Иегуды, похоже, не работают (возможно, это ошибка с его стороны), но когда я это делаю match '/example', :to => MyApp и get '/example' в MyApp , я получаю действительный ответ. Не могли бы вы убедиться, что делаете это правильно? Я тестировал с использованием Rails 3.0.6 и Sinatra 1.2.2.

3. Хорошо, я заставил это работать, используя ваш пример, после того, как я создал другое приложение. Возможно, это было так просто, как мне нужно было перезапустить Webrick с моим исходным примером, мой плохой. Спасибо!