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 | Один комментарий

jQuery Tools: Tabs и Dateinput