rails new myapp | 새 앱 생성 |
rails new myapp --api | API 전용 앱 생성 |
rails server / rails s | 서버 시작 |
rails console / rails c | 콘솔 열기 |
rails dbconsole / rails db | 데이터베이스 콘솔 |
rails routes | 모든 라우트 표시 |
rails routes -g users | 라우트 검색 |
rails g model User name:string email:string | 모델 생성 |
rails g controller Users index show | 컨트롤러 생성 |
rails g scaffold Post title:string body:text | 스캐폴드 생성 |
rails g migration AddAgeToUsers age:integer | 마이그레이션 생성 |
rails g mailer UserMailer | 메일러 생성 |
rails g job ProcessData | 잡 생성 |
rails destroy model User | 생성된 파일 삭제 |
rails db:create | 데이터베이스 생성 |
rails db:migrate | 마이그레이션 실행 |
rails db:rollback | 마이그레이션 롤백 |
rails db:seed | 시드 실행 |
rails db:reset | 삭제, 생성, 마이그레이션, 시드 |
rails db:migrate: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