Программирование на языке Ruby - [216]
Прежде всего, интерес представляет файл >run.rb
. В зависимости от того, как вы развернули свою программу, его запуском может заниматься диспетчерский сценарий в каталоге >public
. Но для демонстрации и тестирования вы можете запустить его вручную и воспользоваться встроенным диспетчером WEBrick. Впрочем, для промышленной эксплуатации имеет смысл изучить предоставляемую Nitro поддержку Mongrel, SCGI или FastCGI.
Nitro поддерживает много разных архитектур и паттернов, а приложение обычно строится на базе паттерна Модель-Вид-Контроллер (model-view-controller, MVC). Окончательный выбор всегда остается за вами, a Nitro облегчает переход от простых сайтов, предназначенных только для просмотра, к полноценным приложениям с поддержкой базы данных.
По умолчанию при обработке запроса Nitro сначала ищет файл в папке >public
. Предполагается, что если имя страницы явно не указано, речь идет о файле >index.html
. В этом отношении Nitro ведет себя как любая статическая система. При желании мы можем поместить в папку >public
дополнительные статические HTML-страницы, а в ее подпапках хранить изображения и CSS-файлы.
Но интереснее то, что происходит, когда Nitro не может найти прямого соответствия запрошенной странице. Давайте изменим расширение файла >index.html
на >.xhtml
:
>public/index.xhtml
Перезапустите сценарий >run.rb
. Снова введите URL http://127.0.0.1:9999, вы должны увидеть ту же самую страницу. Не найдя файла >index.html
, Nitro ищет файл >index.xhtml
и загружает его. По умолчанию >xhtml
— расширение, применяемое в Nitro для динамического контента. В общем случае, получив запрос, Nitro сначала ищет файл с расширением >html
, а потом — >xhtml
.
В XHTML-файлах могут быть подставляемые переменные и программная логика. Измените файл >index.xhtml
следующим образом:
>
>
>
>
>
>
The Ruby Way
>
Hal Fulton
Page last updated: #{Time.now}>
>
>
После перезагрузки страницы вы увидите текущие дату и время. Nitro также поддерживает синтаксис команд обработки, принятый в XML:
>
>
>
>
>
>
>
The Ruby Way
>
Hal Fulton
Page last updated: #{curr_date}>
>
>
Отметим, что из наличия синтаксиса >
не следует, что весь шаблон должен подчиняться правилам XML. Nitro располагает средствами для обработки шаблонов как XML-документов, а такой синтаксис позволяет иметь шаблоны, которые одновременно являются корректными XML-документами.
19.4.2. Nitro и паттерн MVC
Вставка кода непосредственно в шаблон удобна для экспериментов и перехода со статических страниц на динамические. Но со временем обнаруживается, что тестировать и сопровождать такое приложение становится все сложнее. Паттерн Модель-Вид-Контроллер позволяет упростить жизнь за счет переноса кода в классы Ruby.
Начнем с создания класса контроллера >main.rb
. Если в каталоге приложения есть папка >src
, Nitro добавит ее в список путей, по которым ищутся страницы. Следуя принятым в Nitro соглашениям, создадим файл >
:
>class BookController
> def index
> @author = "Hal Fulton"
> @title = "The Ruby Way"
> @last_update = Time.new
> end
>end
Изменим файл >index.xhtml
, включив в него ссылки на эти переменные:
>
>
>
>
>
>
#{@title}
>
#{@author}
Page last updated: #{@last_update}>
>
>
Придется также немного подправить файл >run.rb
:
>require 'nitro'
>require 'controller/book'
>Nitro.run(BookController)
Перезапустите сервер WEBrick и перезагрузите страницу, чтобы посмотреть на результат.
Отметим несколько вещей. Файлы шаблонов могут остаться в папке >public
; класс контроллера не обязан расширять какой-то специальный базовый класс; класс, переданный методу >Nitro.run
, автоматически сопоставляется с корневым URL приложения. Все эти аспекты конфигурируемы.
По умолчанию Nitro ищет шаблоны в каталогах >template
и >public
. Если вы не хотите помещать шаблоны в каталог >public
(скажем, потому, что предпочитаете зарезервировать его только для статических HTML-файлов), то можете создать каталог >template
и хранить их там. Предполагается, что пути к шаблонам повторяют пути, заданные в URL, относительно корневой папки шаблонов. Наш файл >index.xhtml
мог бы храниться как >public/index.xhtml
или >template/index.xhtml
. Использование каталога >public
упрощает переход от статического сайта к динамическому, но лучше организовать раздельное хранение статических файлов и шаблонов.
Классы контроллеров могут отображаться на пути URL с помощью файла >Server.map
. Например, наше демонстрационное приложение может содержать статическую главную страницу со списком литературы (в котором на данный момент присутствует всего одна книга), находящуюся совсем по другому пути. Для этого нужно следующим образом изменить файл >run.rb
:
>require 'nitro'
>require 'controller/book'
>Nitro::Server.map = { '/books' => BookController }
>Nitro.run()
Соответствующий шаблон нужно будет переместить в другое место, которое соответствовало бы новому пути (
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.