Вход/Регистрация
Программирование на языке Ruby
вернуться

Фултон Хэл

Шрифт:

Nitro.run

Соответствующий шаблон нужно будет переместить в другое место, которое соответствовало бы новому пути (

template/books/index.xhtml
)

Перезапустите сервер и укажите новый URL:

http://127.0.0.1:9999/books

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

src/model/book.rb
, содержащий описание модели
Book
:

class Book

 @@items = {}

 attr_accessor :title

 attr_accessor :author

 attr_accessor :update_time

 def initialize( values = {} )

@title, @author = values[:title], values[:author]

@update_time = Time.now

 end

 def save

@@items[author] = self

 end

 def self.find(author)

@@items[author]

 end

end

Теперь контроллер может запрашивать данные у класса

Book
. Изменим метод
index
:

def index

 book = Book.find_by_author("Mark Twain")

 @author = book.author

 @title = book.title

 @last_update = book.update_time

end

А в файл

run.rb
вставим ссылку на модель
Book
и загрузим какие-нибудь данные:

require 'model/book'

Book.new(:title => "Life on the Mississippi",

:author => "Mark Twain").save

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

find
:

def find(author)

 book = Book.find_by_author(author)

 @author = book.author

 @title = book.title

 @last_update = book.update_time

end

Это тот же код, что в методе

index
(и для создания соответствующего ему шаблона достаточно было бы переименовать
index.xhtml
в
find.xhtml
), но он принимает один аргумент — имя автора. Хотя мы разрабатываем Web-приложение, класс контроллера мало чем отличается от класса в любом другом приложении, написанном на Ruby. Самое заметное отличие заключается в том, что методы не возвращают значений, но никаких зависимостей от специальных переменных окружения или каких-то особых объектов нет. (Впрочем, имейте в виду, что Nitro все же добавляет разные «приятности» для программирования Web-приложений; для доступа к ним достаточно унаследовать свой класс от
Nitro::Controller.
) Например, Nitro обеспечивает «обстраивание», быструю передачу сообщений от одного запроса другому и хитроумный конвейер конструирования страницы, но все это только если вы сами захотите.

Сделаем еще одно замечание по поводу методов контроллера. Методы, предназначенные для обработки запросов на получение страницы, обычно идут в паре с шаблонами, имеющими схожее имя. Для получения конечного результата Nitro объединяет метод и шаблон. Мы видели, что Nitro может работать без контроллеров, ограничиваясь только видами. Но верно и обратное. Метод контроллера может генерировать всю страницу вообще без шаблона. Запросы на получение страниц обрабатываются в Nitro как действия (actions). Действие — это комбинация вида и методов контроллера. Внутри себя Nitro динамически создает методы действия, объединяющие то и другое. Но если какой-то компоненты недостает, ничего страшного не случится. Если у действия нет шаблона, результатом становится значение, возвращаемое методом контроллера.

Например, некоторый URL может отвечать на запрос, возвращая лишь название книги. Для этого достаточно такого метода контроллера

BookController
:

def sparse(author)

 @context.content_type = 'text/plain'

 book = Book.find_by_author(author)

 book.title

end

Если метод контроллера возвращает не HTML-документ, то следует изменить заголовок content-type, отравляемый вместе с ответом в результате присваивания

@context.content_type=
. (Кстати, даже если парный шаблон существует, его можно не использовать, переопределив метод
render_text
.)

Но откуда метод

find
или
sparse
получает аргумент? По умолчанию Nitro следует привычному для Web-приложений паттерну, согласно которому сегменты пути URL отображаются на контроллеры, методы и аргументы. Перезапустите приложение и введите такой URL: http://127.0.0.1:9999/books/find/Hal%20Fulton.

Обратите внимание, что

%20
— это кодированное представление пробела в имени автора. Nitro производит декодирование еще до вызова метода
find
.

  • Читать дальше
  • 1
  • ...
  • 302
  • 303
  • 304
  • 305
  • 306
  • 307
  • 308
  • 309
  • 310
  • 311
  • 312
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: