Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пример диплома специалиста / 002 Пояснювальна записка.docx
Скачиваний:
15
Добавлен:
28.03.2016
Размер:
323.39 Кб
Скачать

16

02070743.00569-01 81 01

Рис. 2.2. Архітектура шаблону MVC для Rails

Rails прекрасно справляється з автоматизацією не дуже складних завдань. Якщо це має сенс, він сам генерує код, позбавляючи програміста від необхідності писати його вручну [12].

Web-застосування часто зберігають дані в базі, і Rails забезпечує безшовну інтеграцію з базою даних. В Web-каркасах спостерігається тенденція проявляти схильність до якогось конкретного об'єктно-реляційного відображення (object-relational mapper, ORM), і Rails – не виключення. Стандартним для Rails є відображення ActiveRecord. На його основі будуються призначені для користувача моделі даних і зв'язуються з контролерами (рис. 2.3).

17

02070743.00569-01 81 01

Рис. 2.3. Зв'язок управління web-застосування (контроллера) і БД (моделі)

Бази даних описуються у файлі config/database.уaml – одному з небагатьох необхідних конфігураційних файлів (звичайно ж, у форматі YAML). У ньому перераховано три різні бази даних: для розробки, для тестування і для промислової експлуатації. На перший погляд, це перебір, але насправді така схема виявляється дуже зручною.

Rails генерує порожні моделі і контролери. В ході редагування моделей ви визначаєте зв'язки між таблицями бази даних за допомогою таких методів, як has_many і belongs_to (і багато інших). Оскільки між моделями і таблицями є відповідність, то написаний вами код заразом визначає і зв'язки між самими моделями. Для контролю даних служать такі методи, як validates_presence_of (перевіряє, що дані присутні) і validates_uniqueness_of (перевіряє, що дані унікальні).

Рис. 2.4. Зв'язок управління web-застосування (контролера) і призначеним для користувача виглядом в браузері

В результаті створення застосування Rails командою вигляду rails appname ви отримуєте каталог appname з такою структурою:

18

02070743.00569-01 81 01

арр

controllers

helpers

models

views

config

db

doc

lib

log

public

script

test

vendor

Велика частина коду знаходиться в каталозі арр. Як бачите, сама його структура слідує патерну MVC. Схеми баз даних знаходяться в каталозі db. Інкрементні файли міграції теж попадуть сюди. У Rails є концепція «оббудовування» (scaffolding), яка дуже спрощує життя. Якщо ввести команду script /generate scaffold Product (Product – ім'я моделі), то для таблиці Products (звернете увагу на множину) згенерується функціональність «створити-відновити-видалити».

Можна оббудуватися і не генеруючи жоден код – досить викликати усередині контролера Product метод scaffold:

class ProductController < ActiveRecord::Base

scaffold :product

end

Слід зазначити, що в Rails процедура створення структури ActiveRecord для конкретної БД визначається командою

Rake DB:Migrate

19

02070743.00569-01 81 01

а власне правила створення таблиць описуються в каталозі db/migrate у вигляді послідовності класів, що реалізовують «інтерфейс» ActiveRecord::Migration [12]. Правила ж доступу до даних за допомогою ActiveRecord описує власне сама модель.

На основі даного каркасу і особливостей шаблону MVC, розглянемо загальну архітектуру Web-застосувань на основі Rails:

Рис. 2.5. Загальна архітектура Web-застосування, заснованого на MVC

2.6.1.4. Базові розширення

Одне з достоїнств Rails – наявність широкого набору допоміжних методів, визначених в модулі ActiveSupport::CoreExtensions. Вони нешкідливі і після додавання в основні класи стають доступні всьому застосуванню.

Деякі з цих методів мають відношення до роботи з датами і часом. Оскільки усередині системи час зберігається в секундах, то мають сенс методи minutes і hours:

20

02070743.00569-01 81 01

elapsed = 3.days + 4.hours + 17.minutes

later = Time.now + elapsed

Можна робити і такі речі:

time = 3.minutes.from_now #то ж, що Time.now + 3.minutes.

t2 = 5.days.from_now

Операції з часом представлені особливо повно. За допомогою методів midnight, next_month і beginning_of_week можна точно і коротко задавати моменти часу.

Один з найвідоміших трюків в цьому модулі – метод Symbol#to_proc. Він дозволяє передавати символ, що представляє ім'я методу, замість блоку. Наприклад, наступні дві пропозиції еквівалентні:

arr = array.map { |x| x.upcase }

arr = array.map { &:upcase }

Окрім згаданих тут методів, є ще десятки інших. Одні займаються перетворенням різних одиниць виміру часу, інші – перекладом з YAML або XML, треті, – перевіркою правопису і розставлянням розділових знаків в рядках і так далі [16].