Rails +α メモず

# はじめに

メモ群なので、気になった見出しをご覧ください！
# メモず
## `scaffold`って何？
**「全生成便利コマンド」**

> Railsのscaffold（スキャフォールド）は、Ruby on Railsフレームワークの機能の一つで、CRUD（Create, Read, Update, Delete）操作を行うための基本的なアプリケーションコードを自動的に生成するツールです。RailsはRuby言語で書かれたWebアプリケーションフレームワークで、開発を迅速かつ簡単にするための多くの便利な機能を提供しています。
> 
> scaffoldを使用すると、以下のようなコンポーネントが生成されます：
> 
> 1. **モデル（Model）**: データベースのテーブルに対応するRubyクラス。データの検証（バリデーション）、関連付けなどのロジックを含む。
>     
> 2. **ビュー（View）**: アプリケーションのユーザーインターフェース。通常、HTMLテンプレートであり、ERB（Embedded Ruby）が使用されることが多い。
>     
> 3. **コントローラー（Controller）**: モデルとビューをつなぐ役割を持ち、ユーザーのリクエストに応じてデータの処理を行い、適切なビューを表示する。
>     
> 4. **マイグレーションファイル**: データベースのスキーマを定義し、変更を管理するためのスクリプト。
>     
> 5. **テストコード**: 生成されたモデル、ビュー、コントローラーの基本的なテストを自動生成。
>     
> 
> scaffoldを使用することで、Rails開発者はこれらの基本的なコンポーネントを手作業で作成する時間を節約し、より複雑な機能やビジネスロジックの開発に集中できます。ただし、scaffoldによって生成されるコードは非常に基本的なものであり、実際のアプリケーションではカスタマイズや追加の開発が必要になることが一般的です。

### `scaffold`と`generate`コマンドの違い
`scaffold`：全てのコンポーネントを一度に生成する
`generate`：一般的な生成コマンド

### `scaffold`の原義
> 英語の原義において、**「scaffold」は建設や修理の作業を行う際に使用される一時的な構造物を指します。** 通常、高い場所での作業を容易にし、安全を確保するために使われる足場（または仮設足場）を意味します。この構造物は、建築物の外壁や内部で作業する人々が、必要な高さに達し、材料やツールを安全に持ち運び、使用できるように設計されています。
> 
> Ruby on Railsにおける「scaffold」コマンドは、この建設用語から着想を得ています。建設現場での足場が、建築物の基本的な構造や形を早く簡単に作り上げるのを助けるように、RailsのscaffoldはWebアプリケーションの基本的な構造を早く簡単に構築するのを助けます。つまり、プログラミングにおけるscaffoldは、アプリケーション開発の初期段階での迅速なスタートアップやプロトタイピングを支援するための **「足場」** のようなものと考えることができます。

### `rails g scaffold_controller`と`rails g scaffold`の違い

> 1. **Modelを中心にする（`rails g scaffold`の場合）**
>     
>     - `rails g scaffold`コマンドは、モデル、コントローラー、ビュー、マイグレーションファイル、テストスクリプトを一括で生成します。
>     - このコマンドは、データモデルからアプリケーションのCRUD機能を全面的に構築したいときに使用されます。
>     - データベースのマイグレーションファイルも生成されるため、データベーススキーマの作成や変更がこのプロセスの一部となります。
> 2. **Controllerを中心にする（`rails g scaffold_controller`の場合）**
>     
>     - `rails g scaffold_controller`コマンドは、指定されたモデルに対するコントローラーとビューのみを生成します。
>     - このコマンドは、モデルとデータベースのマイグレーションが既に存在し、それに基づいてビューとコントローラーのみを追加する必要がある場合に適しています。
>     - データベースの変更や新しいテーブルの追加を伴わないため、既存のデータ構造に対するフロントエンドとサーバーサイドのロジックを追加する際に便利です。
> 
> 要するに、`rails g scaffold`はアプリケーションのある機能に関連するすべての基本的なコンポーネントをゼロから生成するのに対し、`rails g scaffold_controller`は特定のモデルに対して既に存在する構造を基に、コントローラーとビューを中心にコンポーネントを生成します。これは、アプリケーションの開発段階や既存のコードベースに応じて、より柔軟なアプローチを提供します。

## Strong Parameters
`require`および`permit`メソッドを用いて記述されるもの
例
```rb
params.require(:user).permit(:name, :email)
```

[paramsはハッシュではない](https://qiita.com/jnchito/items/74441837934ab8d006a1)理由でもある。
Strong Parametersを実現するため、paramsはハッシュではなくActionController::Parameters オブジェクトを返す。

なお、`require` / `permit`を書かず、`params[:user][:name]`のような直接のアクセスも可能であり、この場合は「Strong Parameters = アクセスの明示的な制御」は達成されない。

## `root to: 'path'`？`root 'path'`？
単に省略形なだけ
```rb
root to: 'pages#main'
root 'pages#main' # 上の省略形
```

## `form_with`
> `form_with`はRuby on Railsフレームワークにおけるヘルパーメソッドの一つで、フォームを作成する際に使用します。**`form_for`や`form_tag`ヘルパーの代わりとして**Rails 5.1から導入され、より柔軟で統一された方法でフォームを扱うことができます。`form_with`はモデルに基づくフォームでも、**それとは無関係なフォームでも使用できるのが特徴**です。
> 
> ### 基本的な使い方
> 
> `form_with`の基本的な構文は以下の通りです：
> 
> ```ruby
> form_with(model: @model, local: true) do |form|
>   # フォームフィールド
> end
> ```
> 
> - `model`: フォームに結びつけるモデルオブジェクト。指定すると、モデルの属性に基づいたフォームフィールドが生成され、フォームの送信先も自動で推測されます。
> - `local`: デフォルトでは`form_with`はAjaxによる送信を行います（`remote: true`がデフォルト）。`local: true`を指定すると、通常のHTTPリクエストによる送信になります。
> 
> モデルが新規の場合（例えば、`@model.new_record?`が`true`の場合）、フォームは通常、関連するコントローラーの`create`アクションにデータをPOSTします。既存のレコードを編集する場合は、`update`アクションにPATCHリクエストを送信します。
> 
> ### モデルを使用しない場合
> 
> モデルと結びつかないフォームを作成する場合は、`url:`オプションを使用して送信先を指定します。
> 
> ```ruby
> form_with(url: search_path, method: :get, local: true) do |form|
>   # フォームフィールド
> end
> ```
> 
> この場合、`model`オプションは不要です。フォームフィールドは手動で定義する必要があります。
> 
> ### カスタマイズ
> 
> `form_with`を使用すると、フォームの`id`や`class`といったHTML属性も簡単にカスタマイズできます。例えば：
> 
> ```ruby
> form_with(model: @model, local: true, html: { id: 'my-form', class: 'my-form-class' }) do |form|
>   # フォームフィールド
> end
> ```
> 
> このように、`form_with`はRailsアプリケーションにおけるフォーム作成をより柔軟で簡単にするための強力なツールです。モデルに基づいたフォームもそうでないフォームも、この一つのメソッドで網羅的に扱うことができます。
> 
> `   <%= form_with model: Board.new, local: true do |form| %>`と`<%= form_with model: @board, local: true do |form| %>`は似ていますが、完全に同じ意味ではありません。主な違いは、フォームに渡されるモデルのインスタンスがどのように初期化されているかにあります。

> 1. `<%= form_with model: Board.new, local: true do |form| %>`: これは`Board`クラスの新しいインスタンスを直接フォームに渡しています。ここでは、新しい`Board`オブジェクトが直接フォームに渡され、このオブジェクトは新しく作成されたばかりで、データベースにはまだ保存されていない新しいレコードを表します。この形式は、主に新しいレコードを作成する場合に使用されます。
>     
> 2. `<%= form_with model: @board, local: true do |form| %>`: こちらは、コントローラからビューに渡された`@board`インスタンスをフォームに渡しています。`@board`は、コントローラのアクション内で定義されている変数であり、新しいインスタンス（`Board.new`）である場合もあれば、データベースから取得した既存のレコードのインスタンスである場合もあります。この方式の主な利点は、同じフォームを新規作成と編集の両方に使用できる柔軟性があることです。`@board`が新しいインスタンスであれば新規作成フォームとして機能し、既存のインスタンスであれば編集フォームとして機能します。
>     
> 
> 要するに、`Board.new`を直接使用する方法は、明示的に新しいレコードを作成する場合に使用し、`@board`を使用する方法は、新規作成と編集の両方のコンテキストで柔軟に対応できるようにするために使用します。どちらを使用するかは、実装の意図とコントローラでの変数の設定によって決まります。

## `"` と `'` の使い分け
> Railsにおける`"`（ダブルクォート）と`'`（シングルクォート）の使い分けは、基本的にRubyの標準的な使い分けに従います。主な違いは、ダブルクォート内では式展開（`#{}`を使用したコードの挿入）や特定のエスケープシーケンス（例えば`\n`での改行）が可能であるのに対し、シングルクォートではこれらが文字列として扱われる点です。
> 
> ### ダブルクォート`"`
> - 式展開を使用する場合
> - 特定のエスケープシーケンスを使用する場合（`\n`、`\t`など）
> - 例: `"こんにちは、#{user.name}さん！"`
> 
> ### シングルクォート`'`
> - 単純な文字列で、式展開やエスケープシーケンスが不要な場合
> - 文字列がそれ以上解釈されることなく、そのままの値を保持すべき場合
> - 例: `'これは固定の文字列です。'`
> 
> Railsのコードを書く際には、これらの違いを意識して適切に使い分けることが推奨されます。例えば、ローカライズやモデル属性名のように動的に変化する値を文字列内で扱う場合にはダブルクォートを、静的なI18nのキーやHTMLタグの属性値など、明確に固定値とわかる場合にはシングルクォートを使用することが一般的です。