Когда я начал работать над своим первым проектом на 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 можно здесь.