Ruby on Railsの自分用覚書

## 1. コントローラ（Controllers）
`app/controllers/`：リクエストの処理とモデル・ビューの連携を担う。

**例1: 基本的なCRUDアクション**
```ruby
class UsersController < ApplicationController
  def index
    @users = User.all
  end

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      redirect_to @user
    else
      render :new
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update(user_params)
      redirect_to @user
    else
      render :edit
    end
  end

  def destroy
    @user = User.find(params[:id])
    @user.destroy
    redirect_to users_path
  end

  private

  def user_params
    params.require(:user).permit(:name, :email)
  end
end
```

**例2: 非同期リクエストを処理するAjax対応アクション**
```ruby
def toggle_active
  @user = User.find(params[:id])
  @user.update(active: !@user.active)
  respond_to do |format|
    format.html { redirect_to users_path }
    format.js   # toggle_active.js.erbを呼び出す
  end
end
```

## 2. モデル（Models）
`app/models/`：データベースとのやりとりを定義する。

**例1: バリデーション**
```ruby
class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true, uniqueness: true
end
```

**例2: コールバック**
```ruby
class User < ApplicationRecord
  before_save :capitalize_name

  private

  def capitalize_name
    self.name = name.capitalize
  end
end
```

## 3. ビュー（Views）
`app/views/`：ユーザーにデータを表示する。

**例1: 部分テンプレート**
`app/views/users/_user.html.erb`：
```erb
<li><%= user.name %> - <%= user.email %></li>
```

`app/views/users/index.html.erb`：
```erb
<h1>Users List</h1>
<ul>
  <%= render @users %>  <!-- 部分テンプレートの呼び出し -->
</ul>
```

**例2: Ajaxでの部分更新**
`app/views/users/toggle_active.js.erb`：
```javascript
$("#user_<%= @user.id %>").toggleClass("active");
```

## 4. ルーティング設定（Routes）
`config/routes.rb`：ルーティングの定義。

**例1: 基本的なRESTfulルート**
```ruby
Rails.application.routes.draw do
  resources :users
end
```

**例2: カスタムアクション**
```ruby
Rails.application.routes.draw do
  resources :users do
    member do
      patch :toggle_active
    end
  end
end
```

## 5. マイグレーション（Migrations）
`db/migrate/`：データベースの構造を管理。

**例1: カラム追加のマイグレーション**
```bash
rails generate migration AddAgeToUsers age:integer
```

生成されるファイル：
```ruby
class AddAgeToUsers < ActiveRecord::Migration[6.0]
  def change
    add_column :users, :age, :integer
  end
end
```

**例2: インデックスの追加**
```bash
rails generate migration AddIndexToUsersEmail
```

生成されるファイル：
```ruby
class AddIndexToUsersEmail < ActiveRecord::Migration[6.0]
  def change
    add_index :users, :email, unique: true
  end
end
```

## 7. 設定ファイル（Configurations）
`config/`：環境ごとの設定を管理。

**例1: ログレベルの設定**
```ruby
# config/environments/development.rb
Rails.application.configure do
  config.log_level = :debug
end
```

**例2: キャッシュ設定**
```ruby
# config/environments/production.rb
Rails.application.configure do
  config.cache_store = :memory_store, { size: 64.megabytes }
end
```

## 9. ヘルパー（Helpers）
`app/helpers/`：ビューで共通的に利用するメソッドを定義する。

**例1: 日付のフォーマット**
```ruby
module UsersHelper
  def formatted_date(date)
    date.strftime("%Y年%m月%d日")
  end
end
```

**例2: ステータスの表示**
```ruby
module UsersHelper
  def user_status(user)
    user.active? ? "Active" : "Inactive"
  end
end
```

## 13. Gemfile
プロジェクトルート：Gemの依存関係を管理する。

**例1: 開発環境と本番環境で異なるGem**
```ruby
group :development do
  gem 'pry'
end

group :production do
  gem 'pg'
end
```

**例2: 特定バージョンを指定**
```ruby
gem 'rails', '~> 6.1.4'
gem 'devise', '~> 4.7'
```

---