rails new myapp | Create new app |
rails new myapp --api | Create API-only app |
rails server / rails s | Start server |
rails console / rails c | Open console |
rails dbconsole / rails db | Database console |
rails routes | Show all routes |
rails routes -g users | Search routes |
rails g model User name:string email:string | Generate model |
rails g controller Users index show | Generate controller |
rails g scaffold Post title:string body:text | Generate scaffold |
rails g migration AddAgeToUsers age:integer | Generate migration |
rails g mailer UserMailer | Generate mailer |
rails g job ProcessData | Generate job |
rails destroy model User | Destroy generated files |
rails db:create | Create database |
rails db:migrate | Run migrations |
rails db:rollback | Rollback migration |
rails db:seed | Run seeds |
rails db:reset | Drop, create, migrate, seed |
rails db:migrate:status | Migration status |
class User < ApplicationRecord
# Validations
validates :name, presence: true
validates :email, uniqueness: true
# Associations
has_many :posts
belongs_to :company
end validates :name, presence: true
validates :email, format: { with: URI::MailTo::EMAIL_REGEXP }
validates :age, numericality: { greater_than: 0 }
validates :terms, acceptance: true
validates :password, length: { minimum: 6 }
validates :username, uniqueness: { case_sensitive: false } before_validation :normalize_email
before_save :encrypt_password
after_create :send_welcome_email
after_destroy :cleanup_files scope :active, -> { where(active: true) }
scope :recent, -> { order(created_at: :desc) }
scope :by_status, ->(status) { where(status: status) }
# Usage: User.active.recent # User has many Posts
class User < ApplicationRecord
has_many :posts, dependent: :destroy
end
class Post < ApplicationRecord
belongs_to :user
end # Through join table
class User < ApplicationRecord
has_many :user_roles
has_many :roles, through: :user_roles
end
class Role < ApplicationRecord
has_many :user_roles
has_many :users, through: :user_roles
end class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
class Post < ApplicationRecord
has_many :comments, as: :commentable
end User.find(1)
User.find_by(email: "a@b.com")
User.find_by!(email: "a@b.com") # raises
User.first
User.last
User.all User.where(active: true)
User.where("age > ?", 18)
User.where(age: 18..30)
User.where.not(role: "admin")
User.where(name: ["Alice", "Bob"]) User.order(:name)
User.order(created_at: :desc)
User.limit(10)
User.offset(20)
User.limit(10).offset(20) User.count
User.sum(:age)
User.average(:age)
User.maximum(:age)
User.minimum(:age)
User.group(:role).count User.joins(:posts)
User.includes(:posts) # eager load
User.left_joins(:posts) class UsersController < ApplicationController
before_action :set_user, only: [:show, :edit, :update, :destroy]
def index
@users = User.all
end
def show
end
def new
@user = User.new
end
def create
@user = User.new(user_params)
if @user.save
redirect_to @user, notice: "Created!"
else
render :new
end
end
private
def set_user
@user = User.find(params[:id])
end
def user_params
params.require(:user).permit(:name, :email)
end
end render :new
render json: @user
render json: @user, status: :created
render plain: "OK"
render html: "<h1>Hello</h1>".html_safe redirect_to users_path
redirect_to @user
redirect_to root_path, notice: "Success"
redirect_back fallback_location: root_path before_action :authenticate_user!
before_action :set_user, only: [:show, :edit]
after_action :log_activity
around_action :wrap_in_transaction Rails.application.routes.draw do
resources :users
resources :posts, only: [:index, :show]
resources :comments, except: [:destroy]
end resources :users do
resources :posts
end
# /users/:user_id/posts/:id get "/about", to: "pages#about"
post "/login", to: "sessions#create"
match "/auth", to: "auth#callback", via: [:get, :post] resources :posts do
member do
post :publish
end
collection do
get :search
end
end namespace :admin do
resources :users
end
# /admin/users class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, index: { unique: true }
t.integer :age
t.references :company, foreign_key: true
t.timestamps
end
end
end class AddAgeToUsers < ActiveRecord::Migration[7.0]
def change
add_column :users, :age, :integer
add_index :users, :age
end
end class ChangeNameInUsers < ActiveRecord::Migration[7.0]
def change
change_column :users, :name, :string, limit: 100
rename_column :users, :name, :full_name
end
end class RemoveAgeFromUsers < ActiveRecord::Migration[7.0]
def change
remove_column :users, :age, :integer
end
end