Overview

As I am digging into Rails again I find myself constantly having to look the naming and syntax of generators up so I am documenting them in this post.

Rails utilizes convention over configuration to speed up development and increase developer happiness. If you embrace this fact you will be alot happer working wih rails. This means that the folders are structured in a certain way and the files/classes/methods need to be named to an opinionated standard. This is to enforce best practices and assist with auto-loading.

Note

This post is mostly a reference for me and is not a deep dive. It may or may not make sense to you without some experiense with Rails.

Controllers

Naming Conventions

Controllers favour pluralization for Controller names.

Singular words are capitalized: Devices.

Multiple word controllers should use CamelCase, with only the last word pluralized: ServiceContracts

Generators

When using the controller generator you define the pluralized controller name with an optional list of actions and options.

Controller generators use the following syntax.

cmd

rails generate controller PluralizedName [list of actions] [list of --options]
    

Controller generators create a number of files and also update the routes file.

cmd

rails generate controller Devices index show
  
# output
create  app/controllers/services_controller.rb
 route  get 'services/index' get 'services/show'
create    app/views/services
create    app/views/services/index.html.erb
create    app/views/services/show.html.erb
invoke  test_unit
create    test/controllers/services_controller_test.rb
invoke  helper
create    app/helpers/services_helper.rb
invoke    test_unit
invoke  assets
invoke    css
create      app/assets/stylesheets/services.css
    
file

# app/controllers/services_controller.rb
class ServicesController < ApplicationController
  def index
  end

  def show
  end
end
    

Models

Naming Conventions

Models favour singular words for the model name.

Singular words are capitalized: Device.

Multiple word models should use CamelCase: ServiceContracts

Model to Database Tables Naming

Singular CamelCase model names map to pluralized snake_case database table names.

Model DB Table
Device devices
ServiceContract service_contracts

Generators

When using the model generator you define the singular model name with an optional list of field:type references and options.

The list of supported types can be found here.

Model generators use the following syntax

cmd

rails generate model SingularName [list of field[:type][:index]] [list of --options]
    

Model generators create a model file as well as the database migration file.

cmd

rails generate model Device name:string description:text
    

file

# app/models/role.rb
class Role < ApplicationRecord
end
    
file

# db/migrate/<timestamp>_create_roles.rb 
class CreateRoles < ActiveRecord::Migration[6.0]
  def change
    create_table :roles do |t|
      t.string :name
      t.text :description

      t.timestamps
    end
  end
end
    

Migrations

Naming Conventions

Migrations names should use CamelCase: CreateMacAddressTable

Generators

Migrations generators have some special conventions that allow for conventient creation of migration files.

Migration generators use the following syntax.

cmd

rails generate migration NAME [list of field[:type][:index]] [list of --options]
    

Create a Table

Create a complete migration with the following command.

cmd

rails generate migration CreateMacAddresses mac_address:macaddr description:string
    

This generates the following migration file.

file

# db/migrate/<timestamp>_create_mac_addresses.rb 
class CreateMacAddresses < ActiveRecord::Migration[6.0]
  def change
    create_table :mac_addresses do |t|
      t.macaddr :mac_address
      t.string :description
    end
  end
end
    

Add a Column

If the migration name includes the phrase AddColumnToTable and is followed by a list of name:type values a complete migration will be generated.

cmd

rails generate migration AddDescriptionToRoles description:text
    

This generates the following migration file.

file

# db/migrate/<timestamp>_add_description_to_roles.rb 
class AddDescriptionToRoles < ActiveRecord::Migration[6.0]
  def change
    add_column :roles, :description, :text
  end
end
    

Remove a Column

If the migration name includes the phrase RemoveColumnFromTable and is followed by a list of name:type values a complete migration will be generated.

cmd

rails generate migration RemoveDescriptionFromRoles description:text
    

This generates the following migration file.

file

# db/migrate/<timestamp>_remove_description_from_roles.rb 
class RemoveDescriptionFromRoles < ActiveRecord::Migration[6.0]
  def change
    remove_column :roles, :description, :text
  end
end
    

Rename a Column

First create a migration

cmd

rails generate migration ChangeMacAddressesColumn
    

The above command will generate an empty change migration file. Add the following code to rename the column.
rename_column :table_name, :old_column_name, :new_column_name

file

# db/migrate/<timestamp>_change_mac_addresses_column.rb 
class ChangeMacAddressesColumn < ActiveRecord::Migration[6.0]
  def change
    rename_column :mac_addresses, :mac, :mac_address
  end
end
    

One to Many Association

Create a migration to associate rooms with a site.

cmd

rails generate migration AddAssociationToRooms site:references
    

The following completed migration will be generated.

file

# db/migrate/<timestamp>_add_association_to_rooms.rb 
class AddAssociationToRooms < ActiveRecord::Migration[6.0]
  def change
    add_reference :rooms, :site, null: false, foreign_key: true
  end
end
    

Now you need to update the models with the has_many and belongs_to properties.

A site has_many rooms (plural)

file

# db/models/site.rb 
class Site < ApplicationRecord
  has_many :rooms, dependent: :destroy
end
    

A room belongs_to a site (singular).

file

# db/models/room.rb 
class Room < ApplicationRecord
  belongs_to :site
end
    

Delete a Table

First create a migration

cmd

rails generate migration DropRoles
    

The above command will generate an empty change migration file. Add the following code to rename the column.
drop_table :table_name

file

# db/migrate/<timestamp>_drop_table.rb 
class DropRoles < ActiveRecord::Migration[6.0]
  def change
    drop_table :roles
  end
end
    

Reverse a Generator

Reversing a generator is possible using the following command.

cmd

rails destroy GENERATOR [args] [options]
    

Some examples below.

cmd

rails destroy controller Devices
rails destroy model Device
rails destroy migration AddDescriptionToDevices
    

Summary

Rails generators are super powerful. Use them responsibily.

Tags

rails ruby