Rails: наши первые контроллер и отображение
В прошлой статье, на самом деле, мы не создавали никакого приложения (-: За нас всё сделали «рельсы» (-: Был создан каталог, в нём созданы какие-то другие каталоги, что-то так как-то покрутилось и заработало. Но!.. мы-то сами ничего не сделали… Сегодня мы сами проделаем кое-какую работу, создадим наше первое приложение, которое по свой мощи и функциональности не уступает всем известной программе «Hello world!» (-:
Предполагаю, что Вы уже находитесь в рабочем каталоге, что мы создали в прошлый раз, выполним следующую команду:
$ ruby script/rails g controller Say
Буковка «g» — это всего лишь сокращение от «generate». Иными совами, данная команда создаёт контроллер «Say» со всеми вытекающими последствиями. Вы должны увидеть следующее:
create app/controllers/say_controller.rb
invoke erb
create app/views/say
invoke test_unit
create test/functional/say_controller_test.rb
invoke helper
create app/helpers/say_helper.rb
invoke test_unit
create test/unit/helpers/say_helper_test.rb
Всё без ошибок, всё пучком (-: На данном этапе нас интересует только один файл — «say_controller.rb«. Контроллер пока ещё пустой, совсем-совсем:
class SayController < ApplicationController
end
Единственное, что пока видно — это то, что наш класс SayController производый о другого класса ApplicationController.
Давайте добавим всего пару строк:
def hello
end
Мы просто добавили метод «hello» в наш класс.
Думаю, самое время сделать паузу и рассказать, как в «рельсах» происходит обработка URL, т.е. той строки, которую мы видем в адресной строке браузера. В двух словах, чтобы было понятно:
http://www.supersite.com/conroller/action/params
Т.е. сразу за доменным именем идёт вызов определённого контроллера («contoller»), потом идёт поиск метода этого контроллера («action»), последняя часть — это параметры, которые передаются в данный метод. Мы раньше уже создали контроллер и его метод, можем запустить сервер и попытаться запросить следующую строку:
http://localhost:3000/say/hello/
Попробуйте набрать в браузере. А увидите вы примерно следующее:
Routing Error
No route matches «/say/hello»
Совсем не то, что ожидалось, да? (-: А в логах сервера должно быть следующее:
Started GET «/say/hello/» for 127.0.0.1 at Sun Sep 05 16:43:35 +0300 2010
ActionController::RoutingError (No route matches «/say/hello»):
Rendered /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.0/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.6ms)
Иными словами — ошибка! Если перевести на человеческий то, что там написано, то «рельсы» не знают, где искать наш контроллер, что отображать и вообще…
Так давайте ж поможем им! Для этого есть специальный файл «config/routes.rb«. Этот файл достаточно хорошо документирован, так что нам просто надо написать, как и что отображать:
match ‘say/hello’ => ‘say#hello’
Чтоб стало понятнее, то тут написано, что если в адресной строке встречается «say/hello» после доменного имени, то следует вызвать контроллер «say» и в нём метод «hello«. Обращаю ваше внимание на то, что такой синтаксис стал возможет только в третьих «рельсах».
После этого перестартуйте сервер и обновте страницу в браузере. Та-там! Опять не вышло! (-: Лично у меня показывает следующее:
Template is missing
Missing template say/hello with {:formats=>[:html], :handlers=>[:erb, :rjs, :rhtml, :rxml, :builder], :locale=>[:en, :en]} in view paths «/home/user/RoR/demo/app/views»
«Рельсы» не нашли, что же мы хотим отобразить в браузере. Дело всё в том, что при создании контроллера «Say» была создана папка «Say» в директории «views». Дело ещё и в том, что по умолчанию «рельсам»требуется файл отображение для каждого метода с тем же названием, но расширением «html.erb«, в нашем случае необходим файл «app/views/say/hello.html.erb«. Давайте создадим этот файл с примерно следующим содержанием:
<html>
<head>
<title>Hello, Rails!</title>
</head>
<body>
<h1>Hello from Rails!</h1>
</body>
</html>
Сохраните его и обновите страницу в браузере. Должны увидеть следуещее:
Hello from Rails!
Если увидели, то всё сделано правильно (-: Но работает оно ещё несколько неправильно… в следующий раз я расскажу, что и почему.
Сентябрь 5th, 2010 by none | Один комментарий