ruby on railsの構文一部

借りた本を返してしまうので備忘録として。
自分が分かりやすいように自分なりの解釈を載せているので違う箇所あるかもしれません。
ご指摘いただけると幸いです。

## データベース作成(SQLite3)
```>sqlite3 db/ファイル名.sqlite3```
```>create table テーブル名(カラム名1 型,カラム名2 型...);```

```create table```はテーブルを作成する文
両方実行するとdbディレクトリにファイルが作成される

※SQL文の末尾は;で終わらせる
(```>drop table テーブル名;```でテーブルの削除が可能)


##テーブルにレコードを入れる
```>insert into テーブル名(カラム名1,カラム名2,...) values(値1,値2,,,)```
※カラムと値の順序は一致させる

##レコードを取り出す
```select カラム名1,カラム名2,... from テーブル名 where 条件式;```
※where文は省略可能 -> 全てのレコードが対象になる
※カラムを全て取り出す場合は*を使用
(>```.headers on```と```>.mode column```を実行した後に上記のコマンドを叩けば表のように出力される)

##レコードを更新
```>update テーブル名 set カラム名1=値1, カラム名2=値2,...where 条件式;```
※whereは省略可能

##レコードの削除
```>delete from テーブル名 where 条件式;```
※whereは省略可能

##モデルクラスとマイグレーションの作成
```rails g model モデル名 カラム名1:データ型 カラム名2:データ型2...```

>マイグレーションとは...
>テーブルの新規作成やテーブルの構造の変更を簡単に管理する仕組み

- マイグレーションで指定できる主なデータ型

|種類|意味|SQLiteのデータ型|
|---|---|---|
|integer|整数|integer|
|float|小数|real|
|string|固定長文字列|varchar|
|text|固定長でない文字列|text|

##Scaffold
アプリの雛形を作成するための機能
`rails g scaffold リソース名 カラム名1:データ型1,カラム名2:データ型2,... `

##before_actionメソッド(コントローラー用)
各アクションで共通して使用できるメソッドを記述することで共通化する
メソッドはpriveteに記述する
条件ハッシュのキーにonlyもしくはexceptを指定し、値に配列で適用アクションのシンボルを記入する事で適用アクションを絞る事も可能

`before_action メソッド名, 条件ハッシュ` 

##render (ビューヘルパー)
ビューから別に切り出されたビューファイルを呼び出すヘルパー
引数に指定した部分テンプレートを呼び出す
`<%= render 部分テンプレート名, キー1:値,キー2:値2,... %>`
第二引数には第一引数に指定した部分テンプレートで使用できる変数を記入

##form_with (ビューヘルパー)
引数の形式にし従って様々なformタグを出力するヘルパーメソッド
モデルに対応したフォームを作成するhtmlを出力してくれる

```
<%= form_with(model:モデルクラスのインスタンス,local:真偽値) do |form| %>
  #表示するフォーム
<% end %>
```

※`local:true`は、Ajaxによるデータ更新を許可するかどうかの設定
(Ajaxによる更新を許可する必要がない場合にはtrueを指定)
特に理由がない場合は、このオプションを指定しておく必要がある
他にも様々な引数の指定があるので詳細は[ドキュメント](https://railsdoc.com/page/form_with)へ

>Ajaxとは...
>サーバーとクライアントの間で処理の完了を待つ必要がなくデータを送受信することができる仕組み
>(Ajaxを使わないとクライアントからの入力をサーバーに送信する場合に、送信が完了するまでの待ち時間が発生する)

##strong parameters
`params/require(取得したいモデル名).permit(キー1,キー2,...)`
 paramsのrequire/permitメソッドはフォームから送信されたデータを指定したものだけに限定する為の仕組み
HTTP
リクエストパラメーターから登録に必要なデータを指定する
不正なフォームから値が送信されてもpermitで指定したキーの値しか受けとらない

##respond_toメソッド
アクセスURLの末尾の拡張子(リクエストフォーマット)によって処理を分ける場合に使用
(リクエストフォーマット:html/json/xml/csv 等)

```
respond_to do |format|
  format.html{
    リクエストフォーマットがHTMLの場合に実行する処理
  }
　format.json{
    リクエストフォーマットがJSONの場合に実行する処理
  }
end
```

##redirect_toメソッド
指定したリダイレクト先に出力したいメッセージを添えてリダイレクトする
`redirect_to リダイレクト先,出力するメッセージ`
※respond_toのブロック内で使用する時はメッセージ入力(flashメッセージ)
notice:~message~ と入力したらview側で<%= notice %>と入力した箇所にメッセージが表示される

##validatesメソッド
モデルクラスに検証ルールを追加する
`validates カラム名,検証ルール`
※検証ルールはActiveRecordが提供する検証ルールの種類をシンボルで指定

##おまけ
- テーブルの存在確認 -> `>.tables`
- テストデータを取り込む -> `>rails db:fixtures:load`
- ルーティングファイルに`resources:テーブル名?(複数形)`とするとCRUD画面が生成される
- railsは拡張子に何も指定されていない場合、フォーマットはhtmlと判断される
- renderとredirect_toの違い
  - render
      - 表示させるviewファイルを指定
      - ログインや入力形式に失敗した場合などに使用
      - ただエラーを表示させるだけ
  - redirect_to
      - URL(HTTPリクエストメソッド）を指定
      - データ更新/削除が必要な場合などに使用
      - controllerの処理が必要
- link_toで指定するリンク先にはprefix名に_pathを付けた形式を指定できる
  - prefix名_path(prefix名.id)の場合はprefixだけでもOK(_pathが省略出来る)
  - ()の中の指定をprefix名にするとprefix名.idと同じ意味になる
- ymlの設定項目
  - adapter -> dbに接続するgem
  - pool -> コネクションブーリングで使用するコネクションの上限数
  - timeout -> dbからの応答待ちの上限時間(ミリ秒単位)
  - database -> db名
- データ型
  - string : 文字列
  - text : 長い文字列
  - integer : 整数
  - float : 浮動小数
  - decimal : 精度の高い小数
  - datetime : 日時
  - timestamp : タイムスタンプ
  - time : 時間
  - date : 日付
  - binary : バイナリデータ
  - boolean : Boolean