:language: Sprache
:book_rank: Buchrank
В шаблонах применяются специальные конструкции для обозначения подставляемого текста:
<div class='detail'>[[:author]]: #{@book.author}</div>
<div class='detail'>[[:language]]: #{@book.language}</div>
<div class='detail'>[[:book_rank]]: #{@book.rank}</div>
Выбор файла локали определяется значением session[:LOCALE]
. В методах контроллера можно получить текущую локаль с помощью специальной переменной @lc
.
@language = @lc[:language]
Если зависимости от языка более обширны, то можно организовать несколько каталогов шаблонов, по одному для каждого языка. Какой из них использовать, определяется значением установленной локали.
Дополнительную информацию о Nitro можно найти на следующих ресурсах:
• http://www.nitroproject.org/ (домашняя страница Nitro)
• http://rubyforge.org/forum/forum.php?forum_id=5921 (страница проекта Nitro на сайте Ruby Forge);
• http://oxyliquit.de/ (справочное и учебное руководство по Nitro).
19.5. Введение в Wee
Согласно заявлению автора Майкла Ноймана (Michael Neumann),
Установить Wee проще всего из gem-пакета (gem install wee
). Во время работы над книгой текущей была версия 0.10.0. В документации по Wee говорится, что, хотя код достаточно устойчив, могут возникать некоторые проблемы из-за продолжений, поэтому пока не стоит использовать этот каркас для критически важных приложений.
Но даже и с такими оговорками Wee заслуживает изучения ради своей компонентной модели, а также потому, что продолжения — интересная, но недостаточно исследованная область, лежащая в стороне от главного направления разработки для Web. Автор говорит, что на него повлияли идеи Seaside, а основанный на продолжениях каркас для Web-приложений на языке Smalltalk написал Ави Брайант (Avi Bryant).
В gem-пакет для инсталляции Wee входит большое число разнообразных примеров. Один из них — Web-интерфейс к обозревателю объектного пространства, другой — применение Ajax на основе библиотеки JavaScript-функций Prototype. Есть также пример, демонстрирующий совместную работу Wee и Nitro.
В основе Wee лежит идея компонентов. Они похожи на виджеты в графических интерфейсах. Компоненты легко поддаются повторному использованию, инкапсулируют состояние, представление и поведение, хотя все это можно делегировать внешним шаблонам или моделям.
19.5.1. Простой пример
Во время установки Wee создается генератор простых приложений, который, естественно, называется wee
. Команда wee create my-demo
создает подкаталог my-demo
в текущем каталоге и записывает в него простое приложение на базе WEBrick.
Созданное приложение всего лишь подсчитывает, сколько раз пользователь щелкнул по ссылке. Файл run.rb
на стороне сервера подготавливает компоненты приложения и главный класс, после чего запускает приложение под управлением сервера WEBrick.
require 'wee'
require 'wee/utils'
require 'wee/adaptors/webrick'
# Ваши компоненты.
require 'components/main'
app = Wee::Utils.app_for do
Main.new.add_decoration(Wee::PageDecoration.new('Wee'))
end
Wee::Utils::autoreload_glob('components/**/*.rb')
Wee::WEBrickAdaptor.register('/арр' => app).start
Класс Main
вызывается как главный компонент приложения. Каждый компонент должен реализовать метод render
, порождающий разметку. Вызов метода add_decoration(Wee::PageDecoration.new('Wee'))
изменяет конвейер построения страницы так, что результаты обращения к Main#render дополняются HTML-кодом заголовка и хвостовика.
Далее конфигурируется автоматическая перезагрузка файлов, чтобы можно было изменить код и проверить, как работает новая версия приложения, не перезапуская WEBrick. И наконец, запускается экземпляр сервера WEBrick, который обслуживает запросы к URL, начинающемуся с пути '/арр'
. По умолчанию подразумевается порт 2000, но можно при запуске указать любой другой номер в качестве параметра:
Wee::WEBrickAdaptor.register('/арр' => арр).start(:Port => 8787 )
Компонент Main
определяет метод render
, который порождает разметку.
class Main < Wee::Component
def initialize
super()
# Здесь должен быть ваш код инициализации...
end
def render
r.anchor.callback(:click).with { r.h1('Welcome to Wee!') }
r.text '#{ @clicks || 'No' } clicks'
end
def click
@clicks = (@clicks || 0) + 1
end
end
Wee позволяет пользоваться синтаксисом Ruby для генерации HTML-кода примерно так же, как библиотека XML Builder Джима Вайриха и генератор XML в Nitro. Однако в Wee можно еще связать ссылку с действием (в данном случае с методом click
). Когда пользователь щелкает по ссылке,