railsまとめ

こんにちはuniです。
今回は「railsを学んで1週間」くらいの初学者向けの記事です。
**辞書的な感じ**の使用を想定しています。

## MVC
MVC（モデル、ビュー、コントローラ）は、webアプリケーションの設計パターン。

### Model
データとその処理を担当。
モデルはアプリケーションの**データの「設計図」**とも言える。
- データベースからデータを取得したり、データを保存したりする役割がある
- データのバリデーションや操作も行う

### View
ユーザーに表示される画面を担当。
- データの表示や入力フォームの表示など、ユーザーとの対話を行う
- ビューはユーザーに見える部分であり、デザインやレイアウト(スタイル)も担当

### Controller
ユーザーのリクエストを受け取り、処理の調整を担当。
- ユーザーからのリクエストを受け取り、それに応じてモデルやビューを操作する
- リクエストに基づいてデータの取得や保存を行ったり、ビューの表示を指示をする
`例：間違ったURLを指定したら404エラー画面を表示させる`


## ルーティング
- ルーティングは、URLとコントローラーのアクションとの対応関係を定義する仕組み
- ユーザーが特定のURLにアクセスした際に、どのコントローラーのどのアクションを実行するかを指定する
- ルーティングの設定によって、正しいコントローラーとアクションが呼び出され、対応するビューが表示される
- config/routes.rbファイルで設定できる
```ruby
#例
Rails.application.routes.draw do
  get '/users', to: 'users#index'
  post '/users', to: 'users#create'
  get '/users/:id', to: 'users#show'
  patch '/users/:id', to: 'users#update'
  delete '/users/:id', to: 'users#destroy'
end
```
上記の例では、/usersにアクセスした場合にはUsersControllerのindexアクションが実行される。
同様に、/users/:idにアクセスした場合にはUsersControllerの対応するアクションが実行される。

## マイグレーション（Migration）
- マイグレーションは、データベースのスキーマ（テーブルやカラムの構造）を設定や変更するための仕組み
```ruby
#例
class CreateUsers < ActiveRecord::Migration[6.0]
  def change
    create_table :users do |t|
      t.string :name
      t.integer :age

      t.timestamps
    end
  end
end
```
上記の例では、CreateUsersという名前のマイグレーションが作成されている。
このマイグレーションでは、`users`という名前のテーブルが作成され、`name`と`age`というカラムが追加される。

## ActiveRecord
データベースのテーブルをモデルとして扱うための機能。
Active Recordを使うことで、データベースとのやり取りを抽象化し、開発者がデータベース関連のコードを簡潔に記述できる。

```ruby
# モデルの作成
class User < ActiveRecord::Base
end

# データの作成
user = User.new(name: 'John', age: 25)
user.save

# データの読み取り
user = User.find_by(name: 'John')
puts user.age

# データの更新
user.age = 30
user.save

# データの削除
user.destroy
```

この例では、`User`という名前のモデルを作成し、データベースの`users`テーブルと関連付けている。`User.new`で新しいユーザーを作成し、`saveメソッド`でデータベースに保存する。
`User.find_by`でデータベースからユーザーを読み取り、属性にアクセスできる。属性の値を変更してsaveすることでデータを更新し、`destroyメソッド`でデータを削除する。
これらの操作はActive Recordの機能を利用して簡潔に記述できる。

## アソシエーション
アソシエーションは、データベースのテーブル間の関連性を表現するための概念。
特徴は以下の通り。
- アソシエーションはActive Recordによって提供される機能
- モデル間の関係性を明確にするために使用される
- 異なるテーブル間のデータの関連を取り扱うことができる

アソシエーションは、`1対1`、`1対多`、`多対多`の関係を表現するための異なるタイプがある。
`1対1`の関係性の場合　→ `belong_to`メソッドを定義
`1対多`の関係性の場合 → `has_many`メソッドを定義

```ruby
# ユーザーモデル
class User < ApplicationRecord
  has_many :posts
end

# 投稿モデル
class Post < ApplicationRecord
  belongs_to :user
end
```
上記の例は、Twitterのような投稿に関することで記述されている。
`Userモデル`は複数の投稿を持つことができるため、`has_many :posts`という関連付けを定義サれている。
一方、`Postモデル`は1つのユーザーに所属するため、`belongs_to :user`という関連付けを定義している。

このように、アソシエーションを使うことで、関連するモデル間でのデータの取得や操作が簡単になる。

## データベースクエリの基本的な操作
データベースクエリの基本的な操作として、作成、読み取り、更新、削除がある。

### レコードの作成（Create）
- 新しいレコードをデータベースに作成する操作
- 例: `User.create(name: "John", age: 25)`

### レコードの読み取り（Read）
- データベースから既存のレコードを取得する操作
- 例: `User.find(1)、User.where(age: 25)`

### レコードの更新（Update）
- データベース内の既存のレコードを更新する操作
- 例: `user = User.find(1)、user.update(name: "Jane")`

### レコードの削除（Delete）
- データベース内の既存のレコードを削除する操作
- 例: `user = User.find(1)、user.destroy`

## バリデーション
バリデーションは、データの妥当性や整合性を確認するための機能。
例えば「名前入力フォームに郵便番号を入れたら弾かれる。」のようなもの。

一般的なバリデーションの昨日は以下の通り。
### 必須フィールドの確認
特定の属性が空でないことを確認する。
例えば、ユーザー登録時、必須項目である`名前`が空白だった場合、送信できないようにできる。

### フォーマットの検証
データが特定のフォーマットに従っているかどうかを確認する。
例えば、郵便番号にちゃんとハイフンが入っているかなどをチェックできる。

### 一意性の確認
特定の属性が一意であるかを確認する。
例えば、ユーザー名や商品コードが他のデータと重複していないかどうかをチェックできる。

### 範囲の制限
特定のデータが特定の範囲内に収まっているかどうかを確認する。
例えば、18歳以上かどうか、価格は特定の金額以上に設定されているかなどをチェックできる。

基本的には`validatesメソッド`を使用してバリデーションのルールを指定する。
```ruby
class User < ApplicationRecord
  validates :name, presence: true
  validates :email, presence: true, format: { with: /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i }
  validates :age, numericality: { greater_than_or_equal_to: 18 }
end
```
上記の例では、ユーザーモデルの`name属性`は必須であることを、`email属性`は必須であり、正しいメールアドレスの形式であることを、`age属性`は18歳以上であることをバリデーションしている。
もしバリデーションに違反するデータがある場合、エラーメッセージが返される。

## ヘルパーメソッド
Ruby on Railsで用意されている便利なアイテム。ヘルパーメソッドを使用することで、より簡単にコードを記述し、一般的なタスクを実行することができる。

### 主要なヘルパーメソッド

#### link_to
リンクを生成するためのヘルパーメソッド。これを指定するだけでなぜか勝手に各ページのURLが生成される。神。
```ruby
<%= link_to 'ホーム', root_path %>
```

#### form_for
フォームを生成するためのヘルパーメソッド。指定したオブジェクトに基づいてフォームを作成し、データの送信先や入力フィールドを自動的に生成される。好き。
```ruby
<%= form_for @user do |f| %>
  <%= f.text_field :name %>
  <%= f.submit '保存' %>
<% end %>
```
#### image_tag
画像タグを生成するためのヘルパーメソッド。指定した画像ファイルのパスを元に、imgタグが生成される。
```ruby
<%= image_tag 'logo.png' %>
```

#### number_to_currency
値を通貨の形式に変換するためのヘルパーメソッド。数値を通貨の形式で表示する際に使用する。神超えて意味不。
```ruby
<%= number_to_currency(@product.price) %>
```
## 部分テンプレート
ビューの一部分を切り出して再利用するためのテンプレート。
主にヘッダーやフッターに用いられる。
ファイル形式はただのHTMLなので、他のHTMLファイル特別するために**"アンダーバー(_)"**から始まる。
```ruby
#_header.html.erb
<nav>
  <ul>
    <li><%= link_to 'Home', root_path %></li>
    <li><%= link_to 'About', about_path %></li>
    <li><%= link_to 'Contact', contact_path %></li>
  </ul>
</nav>
```

このようなヘッダーの部分テンプレートを、メインファイルの"home.html.erb"に使用すると、
```ruby
<!DOCTYPE html>
<html>
<head>
  <title>My App</title>
</head>
<body>
  <%= render partial: 'header' %>

  <h1>Welcome to My App!</h1>

  <!-- 他のコンテンツ -->

</body>
</html>
```
となる。
ここでは`renderメソッド`を使用して`_header.html.erb`を呼び出している。partialオプションに部分テンプレートの`名前`を指定し、Railsが自動的に部分テンプレートを探して表示する。


## CSSとSCSS
CSSは、ウェブページやアプリケーションのスタイルを設定するためのスタイルシート。
SCSSはCSSの拡張機能。

SCSSは、変数、ネスト、ミックスイン、継承などの機能を使用して、スタイルの再利用性と保守性をUPできる。

## ネスト
ある要素の親子関係を意味する。
ある要素や構造が別の要素や構造の中に入れ子になることを指す。
具体的には、ある要素が他の要素の中に配置され、階層的な関係を持つことを意味する。

railsでは、**ルーティングやリレーションシップ（関連付け）** において、リソースやコントローラーを階層的に配置することを指す。

具体的には、ルーティングではURLパスの階層構造を作り、リソースやアクションをグループ化する。
これにより、ネストされたURLを使って特定のリソースやアクションにアクセスすることができる。

```ruby
resources :users do
  resources :posts
end
```
上記の例では、`users`というリソースの中に、さらに`posts`というリソースがネストされている。これにより、`/users/:user_id/posts`といったURLパスが生成される。

## Gem
Gem（ジェム）は、Rubyの拡張機能やライブラリを提供するパッケージのこと.

Railsアプリケーションでは、Gemを使用してさまざまな機能や機能拡張を追加することができる。
例えば、デバッグや認証、画像の処理、ユーザー管理のためのGemがある。

Gemfileの末尾に`gem 'devise'`のようにGemを指定し、ターミナルで`bundle install`と、Bundlerを使ってGemをインストールできる。

## 番外編：HTTPメソッド
プログラミング学習の基本として、`HTTPメソッド`がある。

WebブラウザやWebサーバーがリクエストやレスポンスの種類を識別するためのもの。

例えば、いまユーザーはファイルを「送信」したのか。それとも「一覧を表示」したのか。など、行動を判断すること。

### GETメソッド
GETメソッドは、WebブラウザがWebサーバーに情報をリクエストするためのメソッド。
Webブラウザでウェブページを表示する際に使用される。
「GETする」と覚えれば良い。

### POSTメソッド
POSTメソッドは、WebブラウザがWebサーバーにデータを送信するためのメソッド。
Webフォームの内容を送信する際に使用される。
「POSTに入れる」と覚えれば良い。

### PUTメソッド
PUTメソッドは、WebブラウザがWebサーバーにデータを更新するためのメソッド。
既存のデータを更新する際に使用されます。
これは無理やり覚えよう。

### DELETEメソッド
DELETEメソッドは、WebブラウザがWebサーバーからデータを削除するためのメソッド。
特定のデータを削除する際に使用される。
これはパソコンの「Deleteキー」と同じ。