Ruby on Rails
Соглашения об именах
Поиск…
Контроллеры
Названия классов контроллеров являются множественными. Причина в том, что контроллер управляет несколькими экземплярами экземпляра объекта.
Например : OrdersController
будет контроллером для таблицы orders
. Затем Rails ищет определение класса в файле с именем orders_controller.rb
в orders_controller.rb
/app/controllers
.
Например : PostsController
будет контроллером для таблицы posts
.
Если имя класса контроллера имеет несколько заглавных букв, предполагается, что имя таблицы имеет знак подчеркивания между этими словами.
Например: если контроллер называется PendingOrdersController
тогда предполагаемое имя файла для этого контроллера будет pending_orders_controller.rb
.
модели
Модель названа с использованием соглашения об именах классов для неразрывной MixedCase и всегда единственного имени таблицы.
Например : если таблица была названа orders
, соответствующая модель была бы названа Order
Например : если стол был назван posts
, соответствующая модель будет называться Post
Затем Rails ищет определение класса в файле order.rb
в order.rb
/app/models
.
Если имя класса модели имеет несколько заглавных слов, предполагается, что имя таблицы имеет знак подчеркивания между этими словами.
Например: если модель называется BlogPost
то предполагаемое имя таблицы будет blog_posts
.
Просмотры и макеты
Когда выполняется действие контроллера, Rails попытается найти соответствующий макет и представление на основе имени контроллера.
Представления и макеты размещаются в каталоге app/views
.
Учитывая запрос к PeopleController#index
, Rails будет искать:
- макет, называемый
people
вapp/views/layouts/
(илиapplication
если совпадение не найдено) - представление под названием
index.html.erb
вapp/views/people/
по умолчанию - если вы хотите отобразить другой файл с именем
index_new.html.erb
вам нужно написать код для этого вPeopleController#index
action, напримерrender 'index_new'
- мы можем установить разные
layouts
для каждогоaction
, написавrender 'index_new', layout: 'your_layout_name'
Имена файлов и автозагрузка
Файлы Rails - и файлы Ruby в целом - должны быть названы с lower_snake_case
файлов lower_snake_case
. Например
app/controllers/application_controller.rb
это файл, содержащий определение класса ApplicationController
. Обратите внимание, что, хотя PascalCase
используется для имен классов и модулей, файлы, в которых они находятся, все равно должны быть lower_snake_case
.
Согласованное именование важно, поскольку Rails использует файлы автоматической загрузки по мере необходимости и использует «перегиб» для преобразования между различными стилями именования, такими как преобразование application_controller
в ApplicationController
и обратно.
Например, если Rails видит, что класс BlogPost
не существует (еще не загружен), он будет искать файл с именем blog_post.rb
и попытаться загрузить этот файл.
Поэтому также важно назвать файлы для того, что они содержат, поскольку автозагрузчик ожидает, что имена файлов будут соответствовать содержимому. Если, например, blog_post.rb
вместо этого содержит класс с именем just Post
, вы увидите LoadError
: Expected [some path]/blog_post.rb to define BlogPost
.
Если вы добавите каталог под app/something/
(например, / models / products /) и
- хотите, чтобы пространства имен включали модули и классы внутри нового каталога, вам не нужно ничего делать, и он будет загружен сам. Например, в
app/models/products/ you would need to wrap your class in
модуле Products`. - не хотите, чтобы модули и классы имен занимали пространство внутри моего нового
config.autoload_paths += %W( #{config.root}/app/models/products )
тогда вам нужно добавитьconfig.autoload_paths += %W( #{config.root}/app/models/products )
на вашapplication.rb
для автозагрузки.
Еще одна вещь, на которую нужно обратить внимание (особенно если английский не является вашим первым языком) является тот факт, что Rails учитывает нерегулярные множественные существительные на английском языке. Поэтому, если у вас есть модель под названием «Foot», соответствующий контроллер нужно называть «FeetController», а не «FootsController», если вы хотите использовать «магическую» маршрутизацию рельсов (и многие другие такие функции).
Класс моделей из имени контроллера
Вы можете получить класс Model из имени контроллера таким образом (контекст - это класс Controller):
class MyModelController < ActionController::Base
# Returns corresponding model class for this controller
# @return [ActiveRecord::Base]
def corresponding_model_class
# ... add some validation
controller_name.classify.constantize
end
end