Когда я начал работать над своим первым проектом на Rails, я потратил слишком много времени на изучение того, как использовать генераторы. Чтобы сэкономить время другим, я составил шпаргалку со всеми приемами, которые я изучил для генераторов, которые я использовал чаще всего.
1) рельсы новые
например, новый пиратский проект rails
Это не генератор как таковой, но эту команду стоит знать. И он генерирует все файлы и каталоги, необходимые для запуска приложения Rails. Он также работает bundle install
.
2) генерируются рельсы
например, рельсы g
Выводит все доступные генераторы. Для рельсов:
application_record assets benchmark channel controller generator helper integration_test jbuilder job mailbox mailer migration model resource scaffold scaffold_controller system_test task
3) модель rails g NameOfModel field1: type field2: type…
например, rails g model Имя пирата имя пользователя пароль:digest booty:integer is_space_pirate:boolean
Создает как модель, так и миграцию. Отлично подходит для начала. Убедитесь, что имя вашей модели указано в единственном числе (т. е. Pirate, а не Pirates), но Rails исправит вас, если вы забудете.
Тип атрибута по умолчанию — строка, поэтому вам не нужно его включать (например, name
обрабатывается как name:string
), но вы можете указать другие (например, целое число, логическое значение, дату и время, текст). Запустите rails g model
, чтобы увидеть все параметры. Генератор добавляет метки времени по умолчанию (т. е. created_at и updated_at).
Если вы включите password:digest
, генератор включит поле :password_digest
в миграцию и has_secure_password
метод в модель.
Еще одна полезная опция — references
. Добавление references
к полю создает столбец идентификатора, который отлично подходит для ассоциаций, принадлежащих_кому. Например:
rails g model Ship name pirate:references # generates the Ship migration with a foreign id for Pirate class CreateShips < ActiveRecord::Migration[6.1] def change create_table :ships do |t| t.string :name t.references :pirate, null: false, foreign_key: true t.timestamps end end end # and the Ship model, with the association class Ship < ApplicationRecord belongs_to :pirate end
Не забудьте запустить rails db:migrate
после запуска генератора и внесения необходимых изменений в полученные файлы. Запустите rails g model
, чтобы просмотреть все параметры генератора.
4) миграция рельсов g NameOfMigration
например, rails g migration AddSpeedToShip speed:integer
Создает только миграцию. Отлично подходит для таких вещей, как добавление столбцов или изменение имен или типов столбцов. Если вы назовете миграцию чем-то вроде AddXToY или RemoveXFromY, Rails заполнит всю суть миграции. Например, вы можете добавить в модель корабля поле «скорость»:
rails g migration AddSpeedToShip speed:integer # generates the following migration class AddSpeedToShip < ActiveRecord::Migration[6.1] def change add_column :ships, :speed, :integer end end
В противном случае Rails генерирует пустую миграцию.
rails g migration ChangeSpeedTypeToString # generates the following migration class ChangeSpeedTypeToString < ActiveRecord::Migration[6.1] def change end end
Запустите rails g migration
, чтобы увидеть все варианты.
5) контроллер rails g NameOfController action1 action2…
например, указатель rails g controller Pirates показывает новое редактирование
Создает файл контроллера, набор маршрутов, каталог представления и шаблоны представления для каждого действия. Например:
rails g controller Pirates index show new edit # generates a controller and actions... class PiratesController < ApplicationController def index end def show end def new end def edit end end # views... <h1>Pirates#index</h1> <p>Find me in app/views/pirates/index.html.erb</p> # and routes in the routes.rb file Rails.application.routes.draw do get ‘pirates/index’ get ‘pirates/show’ get ‘pirates/new’ get ‘pirates/edit’ end
Обратите внимание, что в файле routes.rb
Rails добавляет отдельный маршрут для каждого предоставляемого действия, что может быть не идеальным (например, вызов resources
может быть лучше, что вы можете сделать с генератором ресурсов ниже).
Также помните, что модель — это версия имени таблицы в единственном числе, а контроллер — версия имени таблицы во множественном числе (например, Pirate model, Pirates controller).
Чтобы сгенерировать только файл контроллера без всех дополнительных файлов и папок, используйте следующее:
rails generate controller Pirates index show new edit --no-helper --no-assets --no-test-framework --skip-routes --skip
Запустите rails g controller
, чтобы увидеть все варианты.
6) ресурс rails g NameOfResource field1 field2…
например, rails g resource Название территории заглавная
Я не использовал его так часто, потому что в итоге я создавал свое приложение более поэтапно, но этот генератор создал большинство частей, необходимых для приложения MVC. Создает миграцию, модель, контроллер с действиями RESTful, каталог просмотра и полный вызов ресурсов в routes.rb
.
rails g resource Territory name capital # creates a migration... class CreateTerritories < ActiveRecord::Migration[6.1] def change create_table :territories do |t| t.string :name t.string :capital t.timestamps end end end # a model... class Territory < ApplicationRecord end # a controller... class TerritoriesController < ApplicationController end # and a full resources call for all RESTful routes Rails.application.routes.draw do # new resources call for territories resources :territories # old calls from controller generator get ‘pirates/index’ get ‘pirates/show’ get ‘pirates/new’ get ‘pirates/edit’ end
Запустите rails g resource
, чтобы увидеть все варианты.
7) рельсы г леса
Нам не разрешалось использовать генератор скаффолдов для наших проектов, но он настроил бы все за вас — маршруты, контроллеры, представления, модели и миграции.
Дополнительные замечания
Ниже приведены некоторые полезные параметры для создания именно того кода, файлов и каталогов, которые вам нужны, и ничего более.
--no-test-framework
— запрещает генератору создавать стандартные тесты
--skip
— пропускает уже существующие файлы
Для контроллера и генераторов ресурсов:
--no-assets
— запрещает генератору создавать ассеты
--no-helper
— запрещает генератору создавать помощника
--skip-routes
— запрещает генератору добавлять маршруты в routes.rb
Чтобы узнать больше о моем проекте Rails, посетите мой репозиторий GitHub или ознакомьтесь с этим пятиминутным обзором. Посмотреть демо Heroku можно здесь.