Ruby on RailsでCRUD処理をしてみる

Railsの学習を始めるにあたって、基本的な動作である、CRUD処理を学習してみた。現段階の理解度を確認する意味を込めてCRUD処理とActive Recordについてひも解いてみる。


#目次
[1.守破離の「守」一番大事な基礎であるCRUD処理の勉強。](#1-守破離の「守」一番大事な基礎であるCRUD処理の勉強。)
[2.Active Recordとお友達になる。](#2-Active Recordとお友達になる。)
[3.CRUD処理を噛み砕く](#3-CRUD処理を噛み砕く)
[4.まとめ](#4-まとめ)
[5.参考文献](#5-参考文献)

#1. 守破離の「守」一番大事な基礎であるCRUD処理の勉強。

まず、Railsガイドを読みながら理解を深めた。

[Active Record の基礎 - Railsガイド](https://railsguides.jp/active_record_basics.html)

中でもmodelでテーブルが作られる仕組みは、全然頭に入ってこない。

#2. Active Recordとお友達になる。

Active RecordがRailsのMVCに置けるMの役割を果たしているそうだ。

Railsガイドによると、その中でも重要な機能を抜粋すると以下の５つになる。

> モデルおよびモデル内のデータを表現する

> モデル同士の関連付け(アソシエーション)を表現する

> 関連付けられているモデル間の継承階層を表現する

> データをデータベースで永続化する前にバリデーション(検証)を行なう

> データベースをオブジェクト指向スタイルで操作する

正直言ってよく分からない。今理解できていることを下記にまとめてみた。

1. モデル名は単数、テーブルのカラム名は複数かつキャメルケースで表示される。
2. モデルの中にテーブルを作成し、その中に属性を入れ込んでいく。

```ruby

モデルの作成
$ bin/rails g model Genba name:string description:text
```

```ruby
g modelコマンドを実行することで生成されるクラス。
class CreateGenbas < ActiveRecord::Migration[]
 def change
  create table :genbas do |t|
  t.string :name
  t.text :description

  t.timestamps
  end
 end
end
);
```

これで、以下のようにテーブルに格納する項目を追加することができる

```ruby
p = Genba.new
p.name = "Some Book"
puts p.name # "Some Book"
```

#3. CRUD処理を噛み砕く

Create 登録機能

```ruby
def create
 genba = Genba.new(genba_params)#=>privateを呼び出している
 genba.save!
 redirect_to genbas_url, notice: "タスク「#{genba.name}を登録しました。"#=>登録したらrootURLにリダイレクトされる
end

private
def genba_params
 params.require(:genba).permit(:name, :description)#=>:nameと:descriptionのみ許可している
end
```

```ruby
.container
  - if flash.notice.present?
    .alert.alert-success= flash.notice 
#=>これでcreateアクションが完了した時にflashが発行される。
```

Read 一覧表示機能

```ruby
def index 
 @genbas = Genba.all
end
この時はまだSQL文は発行されていない。viewで@genbas.each doのように呼び出された時に初めて
SQL文が実行される。
```

```ruby
index.html.slim

- @genbas.each do |genba|
  tr
    td= genba.name
    td= genba.created_at
こうすることでViewで一覧を表示することができる。
```

Show 検索機能

```ruby
def show
 @genba = Genba.find(params[:id])
end
findはidによってモデルオブジェクトに対応するレコードをDBから検索している。
引数としてparams[:id]を設定している。
params[:id]には、リクエストされたURL"genbas/[タスクのid]"の[タスクのid]の部分が格納されている。
```

Update 更新機能

```ruby
model
def update
    genba = Genba.find(params[:id])
    genba.update!(genba_params)
    redirect_to genbas_url, notice: 'タスク「#genba.name」を更新しました。'
  end

view

```

Edit 編集機能

```ruby
def edit 
 @genba = Genba.find(params[:id])
end
```

```ruby
= link_to '編集する', edit_genba_path(genba), class: 'btn btn-primary mr-3'
```

Delete 削除機能

```ruby
model

def destroy
  genba = Genba.find(params[:id])
  genba.destroy
  redirect_to genbas_url, notice: "タスク「#{genba.name}」を削除しました"
end

view
= link_to '削除', genba, method: :delete, date: { confirm: "タスク「#{genba.name}」を削除します。よろしいですか？} ,class: 'btn btn-danger'
```

Partialを使用したモデルの設定方法

```ruby
view

= render partial: 'form', **locals: {genba: @genba} #=>「インスタンス変数@genbaをパーシャル内のローカル変数genbaをして渡す」**

_form.html.slim

=form_with model: genba, local: true do |f|
 .form-group
   = f.label :name
   = f.text_field :description, class: 'form-control', id:'genba_description'
```

#4. まとめ
簡単な掲示板アプリの作成に必要な考えを学べた。
C　作成処理
R　一覧表示やホーム画面表示
U　更新処理
D　削除処理
次はルーティングに関して勉強したい。

#5. 参考文献

https://railsguides.jp/active_record_basics.html