Ruby on Rails学習メモ

# MVC（Model-View-Controller）とは
ソフトウェア開発における重要なアーキテクチャパターンの一つです。特に、ウェブアプリケーションの開発において広く使用されています。MVCは、アプリケーションのコードを機能的に分割し、保守性と拡張性を向上させるための設計原則を提供します
## Model（モデル）
モデルはアプリケーションのデータとビジネスロジックを扱います。データベースから情報を取得したり、データの操作（追加、削除、更新）を行ったりします。例えば、ブログの場合は、投稿やコメントのデータを管理する役割を持ちます。

## View（ビュー）
ビューはユーザーに表示される部分です。HTMLやCSS、JavaScriptを使って、実際に見えるインタフェースを作ります。モデルから受け取ったデータを表示したり、ユーザーとの対話を可能にするための要素（ボタン、フォームなど）を作成します。例えば、ブログの場合は、投稿一覧や個別の投稿表示などがビューになります。

## Controller（コントローラ）
コントローラはユーザーの操作やリクエストを処理します。ユーザーからの入力を受け取り、それに応じて適切な処理を実行します。具体的には、リクエストを受け取ってモデルからデータを取得し、それをビューに渡す役割を担います。また、ビューからのユーザーの操作（ボタンのクリック、フォームの送信など）を受け取り、それに応じてモデルの更新や他の処理を実行します。

MVCアーキテクチャのメリットは、アプリケーションのコードを機能的に分割し、各パーツの役割を明確にすることです。これにより、コードの再利用性や保守性が向上し、変更や拡張が容易になります。例えば、ビューのデザインを変更する場合でも、モデルやコントローラのコードに手を加える必要がありません。

## パーシャル化とは?
Ruby on Railsの用語で、HTMLを再利用可能な部分（パーシャル）に分割することを指します。パーシャルは、繰り返し使用されるコードを一箇所にまとめ、そのコード片を必要な場所で再利用するためのテクニックです。

たとえば、フォーム部分をパーシャル化するというのは、フォームのHTMLを別のファイル（通常は_form.html.erbなどと名付けられ、アンダースコアで始まるファイル名が一般的です）に切り出すことを意味します。そして、そのパーシャルは、renderメソッドを使って必要なビューから呼び出すことができます。

例えば、new.html.erbとedit.html.erbという2つのビューがあるとします。両方のビューでほぼ同じフォームが使われているとしましょう。この場合、フォームのHTMLをパーシャル（_form.html.erb）に切り出して、それぞれのビューで以下のように呼び出すことができます：

```ruby:ruby
<%= render 'form' %>
```
これにより、フォームのコードを一箇所にまとめることができ、コードの重複を避け、保守性を向上させることができます。また、フォームの変更が必要な場合は、パーシャルを編集するだけで良くなります。

## 変数paramsの使い方

paramsはRuby on Railsで非常に重要な役割を果たすハッシュのようなオブジェクトです。paramsを使うと、コントローラーがブラウザから送られてきたパラメータ（情報）を取得することができます。主に、フォームから送信されたデータやURLの一部（例えば、URLのクエリパラメータやルーティングパラメータ）を取得するのに使われます。

### URLのパラメータを取得する
paramsを使うと、URLの一部として送られてきた情報を取得することができます。

例えば、`http://www.example.com/users/123`　というURLがあるとします。 
ここで123はユーザーのIDを表しています。このユーザーIDをコントローラー内で取得するには、以下のようにparamsを使います。

```ruby:ruby
def show
  @user = User.find(params[:id])
end
```
ここでparams[:id]はURLからID 123を取得します。

### フォームからデータを取得する
フォームからデータを送信すると、そのデータはparamsを通じてコントローラーで取得することができます。例えば、ユーザー名とメールアドレスを持つフォームからデータを送信したとします。そのデータは、以下のようにparamsで取得できます。

```ruby
def create
  @user = User.new
  @user.name = params[:name]
  @user.email = params[:email]
  @user.save
end
```
ここでparams[:name]とparams[:email]はフォームから送信されたユーザー名とメールアドレスを取得します。

なお、フォームから送信されるデータは通常、モデル名でネストされています。例えば、Userモデルのフォームからデータを送信すると、params[:user]の中にユーザーのデータが入っています。そのため、以下のようにデータを取得することがよくあります：

```
def create
  @user = User.new(params[:user])
end
```
ここで、params[:user]はフォームから送信されたユーザーのデータを取得します。

ただし、このようにパラメータを直接モデルに渡すと、セキュリティの問題が生じる可能性があります。そのため、通常は"ストロングパラメータ"と呼ばれる手法を使って、許可されたパラメータだけをモデルに渡すようにします。ストロングパラメータの使用例は以下のようになります：

```ruby
def create
  @user = User.new(user_params)
end

private

def user_params
  params.require(:user).permit(:name, :email)
end
```
ここで、user_paramsメソッドがストロングパラメータを定義しています。このメソッドはparams[:user]から:nameと:emailだけを許可して、それ以外のパラメータを排除します。

## 特定のルートを追加、除外

resources メソッドには only と except オプションがあり、これらは特定のルートだけを追加、除外するのに使うことができます。

例えば、todos リソースに対して index, show, new, create の 4 つのルートだけを生成したい場合、以下のように書くことができます：

```ruby
resources :todos, only: [:index, :show, :new, :create]
```
逆に、すべての標準的なルートを生成したいけど、destroy ルートだけは除外したいといった場合には、以下のように except オプションを使うことができます：
```ruby
resources :todos, except: [:destroy]
```
only や except オプションを使うことで、アプリケーションの要件に合わせてルーティングを細かく制御することができます。

## よく使うコマンド一覧
Ruby on Railsでよく使われるコマンドの一覧

`rails new [アプリ名]`: 新しいRailsアプリケーションを作成します。 末尾に`--api`でapi作成
`rails s(server)`: アプリケーションを開発用サーバーで起動します。
`rails g(generate) [ジェネレータ名]`: モデル、コントローラ、ビューなどのコードを自動生成します。
```ruby
rails g model モデル名 カラム名:データ型
``` 
postsテーブルをつくるにはモデル名をPostと単数形にする。
```
rails g controller　コントローラ名　アクション名
```
コントローラー作成

`rails consoleまたはrails c`: Railsコンソールを起動し、アプリケーションと対話します。
`rails db:migrate`: データベースのマイグレーションを実行し、テーブルやスキーマを更新します。
`rails db:create`: データベースを作成します。
`rails db:drop`: データベースを削除します。
`rails db:seed`: データベースに初期データを投入します。
`rails routes`: アプリケーションのルーティング情報を表示します。
`rails test`: テストスイートを実行し、テスト結果を表示します。
`rails generate scaffold [モデル名]`: モデル、コントローラ、ビューなどを自動生成し、CRUD操作を提供するフル機能のリソースを作成します。
`rails db:migrate:status`: マイグレーションの状態を表示します。
`rails db:rollback`: 直近のマイグレーションをロールバックします。
`rails db:reset`: データベースを削除し、マイグレーションを再実行して初期状態にリセットします。
`rails db:setup`: データベースを作成し、マイグレーションを実行し、初期データを投入します。

## データ型一覧
### 文字列型

VARCHAR(n): string
TEXT: text
CHAR(n): string（長さ固定の文字列）
### 整数型

INTEGER: integer
BIGINT: bigint
SMALLINT: smallint
### 浮動小数点数型

DECIMAL(p, s): decimal
FLOAT: float
REAL: float
### 日付型

DATE: date
DATETIME: datetime
TIME: time
TIMESTAMP: datetime
### 真偽値型

BOOLEAN: boolean
### バイナリ型

BLOB: binary
BYTEA: binary
### JSON型

JSON: json
JSONB: jsonb
### 配列型

ARRAY: array
### 列挙型

ENUM: enum
これらのデータ型は、Railsのマイグレーションファイル内で使用されます。マイグレーションファイルを使用してデータベースのスキーマを作成・変更する際に、適切なデータ型を選択して使用します。