#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 с моим исходным примером, мой плохой. Спасибо!