Программирование на языке Ruby - [219]

Шрифт
Интервал

Естественно, части хранятся в папке >part. Пусть имеется некий код аутентификации пользователя, который можно использовать повторно. Тогда дерево частей приложения могло бы выглядеть так:

>/part/users

>/part/users.rb

>/part/users/public/

>/part/users/controller.rb

>/part/users/model/user.rb

>/part/users/model/acl.rb

>/part/users/template/login.xhtml

>/part/users/template/form.xinc

>/part/users/run.rb

Главный файл >run.rb мог бы включить такую часть с помощью одной директивы >require:

>require 'part/users'

Теперь Nitro будет рассматривать весь код в каталоге >part/users, как если бы он находился в дереве исходных текстов главного приложения. Поиск шаблонов начинается в папке template приложения и продолжается в подкаталогах каталога >part. Если вы хотите переопределить шаблон, поставляемый вместе с частью, то нужно просто поместить замещающий вариант в соответствующий подкаталог папки >template.

Часто приложение должно отображать повторяющиеся данные; обычно они оформлены в виде HTML-таблицы в шаблоне. Если число строк заранее не известно, то придется обойти какой-то набор.

Можно встроить код Ruby непосредственно в шаблон, но Nitro предлагает специальный механизм конвейерной компиляции, чтобы упростить программирование типичных логических конструкций.

Конвейерная компиляция — это последовательность преобразований, которым подвергаются шаблоны по мере объединения в действия. Существуют классы преобразования для различных задач, в частности статического включения файлов, XSLT-преобразований и локализации. Класс >Morphing исследует разметку в шаблоне и ищет специальные атрибуты, которые обозначают различные преобразования.

В нашем демонстрационном приложении данных мало, но если представить себе много авторов, каждый из которых написал несколько книг, то можно было бы показать список книг данного автора. Метод контроллера поместил бы в переменную >@books список книг, а часть шаблона для обхода этого цикла могла бы выглядеть так:

>

Books by #{@author}

>

  • #{book.title}
  • >

Класс >Morphing находит атрибут each элемента li и преобразует его в следующий код:

>

>

  • #{book.title}
  • >

    Порожденная таким образом разметка передается следующему этапу конвейера.

    Точно так же для повтора элемента можно использовать атрибут >times. Например, фрагмент

    >*

    будет преобразован в следующий код:

    >

    >*

    >

    19.4.5. Прочие детали

    В Nitro слишком много различных механизмов, чтобы все их можно было рассмотреть здесь. Но в этом разделе мы упомянем некоторые особенно приятные «вкусности».

    В состав Nitro входит вспомогательный код, позволяющий использовать многочисленные библиотеки JavaScript, которые поддерживают различные формы DHTML и Ajax. Для облегчения интеграции в Nitro применяется высокоуровневый синтаксис. Например, в дистрибутиве Nitro есть пример поиска по сайту Flickr и вывода уменьшенных изображений. Текстовое поле для ввода тегов поиска поддерживает технологию Ajax, что достигается следующей разметкой:

    >

    Контроллер реализует метод >tags_auto_complete, который возвращает строку в формате XML, зависящую от содержимого поля.

    Nitro позволяет кэшировать действия (то есть отрисованные страницы целиком), результаты вызова методов и сгенерированные фрагменты текста. Например, чтобы поместить в кэш результат отрисовки страницы index, контроллер должен вызвать следующий метод:

    >cache_output :index

    Кэширование можно добавить и в сегменты кода:

    >

    >

    • #{book.title}
    • >

    >

    В Nitro встроен класс преобразования для локализации, позволяющий автоматически подставлять в шаблон то или иное содержимое. Он не является стандартным этапом конвейерной компиляции, вы сами должны добавить его в файл >run.rb:

    >require 'nitro/compiler/localization'

    >include Nitro


    >Compiler.transformation_pipeline = [

    > StaticInclude,

    > Elements,

    > Morphing,

    > Markup,

    > Localization,

    > Cleanup

    >]

    Отметим, что конвейер можно переконфигурировать, выбросив стандартные преобразования и добавив собственные. Далее определяются локали:

    >Localization.locales = {

    > :en => 'conf/locales/en.yml',

    > :de => 'conf/locales/de.yml'

    >}

    Локаль — это просто YAML-файл, сопоставляющий одним строкам другие:

    >---

    >:author: Autor

    >:language: Sprache

    >:book_rank: Buchrank

    В шаблонах применяются специальные конструкции для обозначения подставляемого текста:

    >

    [[:author]]: #{@book.author}

    >

    [[:language]]: #{@book.language}

    >

    [[:book_rank]]: #{@book.rank}

    Выбор файла локали определяется значением >session[:LOCALE]. В методах контроллера можно получить текущую локаль с помощью специальной переменной >@lc.

    >@language = @lc[:language]

    Если зависимости от языка более обширны, то можно организовать несколько каталогов шаблонов, по одному для каждого языка. Какой из них использовать, определяется значением установленной локали.


    Рекомендуем почитать
    Графика DirectX в Delphi

    В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


    Вторая жизнь старых компьютеров

    Сейчас во многих школах, институтах и других учебных заведениях можно встретить компьютеры старого парка, уже отслужившие свое как морально, так и физически. На таких компьютерах можно изучать разве что Dos, что далеко от реалий сегодняшнего дня. К тому же у большинства, как правило, жесткий диск уже в нерабочем состоянии. Но и выбросить жалко, а новых никто не дает. Различные спонсоры, меценаты, бывает, подарят компьютер (один) и радуются, как дети. Спасибо, конечно, большое, но проблемы, как вы понимаете, этот компьютер в общем не решает, даже наоборот, усугубляет, работать на старых уже как-то не хочется, теперь просто есть с чем сравнивать.


    DirectX 8. Начинаем работу с DirectX Graphics

    В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


    Симуляция частичной специализации

    В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


    Обработка событий в С++

    В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


    Питон — модули, пакеты, классы, экземпляры

    Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.