Поиск…


Контроллеры

Названия классов контроллеров являются множественными. Причина в том, что контроллер управляет несколькими экземплярами экземпляра объекта.

Например : 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


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow