Добавление показаний времени
Изначально мы решали задачу отображения времени для пользователей нашего
приложения. Теперь мы уже знаем, как заставить наше приложение отображать
динамические данные. Второй вопрос, к которому мы должны обратиться, касается
того, где взять показания времени.
Один из подходов к его решению заключается во вставке вызова Ruby-метода
~ime. now в шаблон hello.rhtml.
Привет,
<п1>Привет от
Сейчас <%=
Работает это следующим образом: при каждом доступе к странице пользователь
видит текущее время, вставленное в тело ответа. И для нашего простейшего
приложения этого может быть достаточно. Но нам все-таки хочется сделать все
немного по-другому. Мы переместим определение отображаемого значения текущего
времени в контроллер, а представлению оставим простую работу по его отображению.
Мы изменим метод действия в контроллере, чтобы присвоить значение
времени переменной экземпляра под названием @time.
Листинг файла app/controllers/say_controller.rb
class SayController < ApplicationController
def hello
@time = Time.now
end
end
Мы воспользуемся этой переменной экземпляра для подстановки времени
в выходные данные файла шаблона, имеющего расширение .rhtml.
Листинг файла app/views/say/hello.rhtml
Привет, R a i I s ! < / t i t l e >
<п1>Привет от Rails!
Сейчас <%= @time %>
После обновления окна браузера мы увидим время, отображенное в стандартном
формате Ruby.
Заметьте, что время обновляется после каждого щелчка на кнопке браузера
Refresh (Обновить). Все выглядит так, будто у нас действительно генерируется динамическое
содержимое.
_______________________________________________________________
Как представление получает данные, содержащие время?
В описании представлений и контроллеров мы показали, что значение времени, предназначенное
для отображения, присваивалось переменной экземпляра. В файле с расширением .rhtml
эта переменная экземпляра использовалась для подстановки текущего времени. Но ведь данные
экземпляра контроллера принадлежат исключительно этому объекту. Как же тогда ERb получает
эти частные данные для использования их в шаблоне?
Вопрос, конечно, интересный. Чтобы внедрить в шаблонный объект переменные, принадлежащие
экземпляру контроллерного объекта, Rails использует магию Ruby. Вследствие этого шаблон
представления может иметь доступ к любой переменной экземпляра, определенной в контроллере,
как к своей собственной.
Некоторые продолжают настаивать: «Как же все-таки эти переменные получают свои значения?
» Похоже, эти люди не верят в чудеса. С ними не стоит справлять Рождество.
_______________________________________________________________
Зачем нам понадобилось все усложнять и устанавливать время, предназначенное
для отображения, в контроллере, а затем использовать его в представлении?
Резонный вопрос. В этом приложении достаточно было вставить Time. now в шаблон,
но, помещая этот метод в контроллер, вы получаете некоторое преимущество.
Например, со временем нам захочется, чтобы наше приложение поддерживало
работу пользователей во многих странах. В этом случае нам также захочется
локализовать отображение времени, выбрав подходящий к месту использования
формат вывода времени, согласно действующей временной зоне. Для этого потребуется
добавить в приложение значительный объем кода, который вряд ли
• н о бы уместно включать в состав представления. Устанавливая отображаемое
•ремя в контроллере, мы делаем приложение более гибким, поскольку можем изменять
в нем формат отображения и временную зону, не нуждаясь в обновлении
в х д о г о представления, в котором это время используется. Время — это данные,
•вторыми контроллер должен снабжать представление. Мы еще увидим множе-
гтво подобных примеров, когда для сравнения будем представлять модели.