# coding: utf-8

2.3.4 Иерархия наследования

Мы заканчиваем наше обсуждение демонстрационного приложения кратким описанием иерархии классов контроллеров и моделей в Rails. Это обсуждение будет иметь много смысла, только если у Вас был некоторый опыт объектно-ориентированного программирования (ООП); если Вы не изучали ООП, не стесняйтесь пропустить этот раздел. В частности, если Вы незнакомы с классами (обсуждаемыми в Разделе 4.4), я предлагаю вернуться к этому разделу позже.

Мы начнем со структуры наследования для моделей. Сравнивая Листинг 2.12 и Листинг 2.13, мы видим, что и модель User и модель Micropost наследовались (через левую угловую скобку <) от ActiveRecord::Base, которая является базовым классом для моделей, обеспеченных ActiveRecord; схема, резюмирующая это отношение, представлена в Рис. 2.16. Благодаря наследованию от ActiveRecord::Base наши объекты модели получают возможность связываться с базой данных, обрабатывать столбцы базы данных, как Ruby атрибуты, и так далее.

Листинг 2.12. Класс User, с наследованием.

app/models/user.rb
  class User < ActiveRecord::Base
    .
    .
    .
  end
Листинг 2.13. Класс Micropost, с наследованием.

app/models/micropost.rb
  class Micropost < ActiveRecord::Base
    .
    .
    .
  end
Иерархия наследования для моделей User and Micropost.

Рис. 2.16 Иерархия наследования для моделей User и Micropost.

Структура наследования для контроллеров лишь немногим более сложная. Сравнивая Листинг 2.14 и Листинг 2.15, мы видим, что и контроллер User и контроллер Micropost наследовались от Application controller. Исследуя Листинг 2.16, мы видим, что сам ApplicationController наследует от ActionController::Base; это базовый класс для контроллеров, обеспеченных Action Pack библиотекой Rails. Отношения между этими классами иллюстрируются в Рис. 2.17.

Листинг 2.14. Класс UsersController, с наследованием.

app/controllers/users_controller.rb
  class UsersController < ApplicationController
    .
    .
    .
  end
Листинг 2.15. Класс MicropostsController, с наследованием.

app/controllers/microposts_controller.rb
  class MicropostsController < ApplicationController
    .
    .
    .
  end
Листинг 2.16. Класс ApplicationController, с наследованием.

app/controllers/application_controller.rb
  class ApplicationController < ActionController::Base
    .
    .
    .
  end
Рисунок 2.17: Иерархия наследования для контроллеров Users и Microposts.

Рисунок 2.17: Иерархия наследования для контроллеров Users и Microposts.

Как и с наследованием моделей, будучи, в конечном счете, наследниками ActionController::Base и Users и Microposts контроллеры имеют большое количество функций, таких как возможность управлять объектами модели, фильтровать входящие запросы HTTP, и визуализировать представления как HTML. Так как все контроллеры Rails наследовались от ApplicationController, правила, определенные в ApplicationController автоматически, применяются к каждому действию в приложении. Например, в Разделе 8.2.4 мы увидим, как определение правила в Application контроллере позволяет нам фильтровать пароли от всех файлов системного журнала Rails, таким образом избегая серьезного потенциального нарушения защиты.

# coding: utf-8