Railsをガイドに沿って基礎から学ぶ②

<h1>はじめに</h1>
この記事はスキルアップを目的とした記録です。
分からない部分を自分なりに補足して書いてます。
前回はRailsを使ってローカル環境でHelloRailsを実行しました。

https://qiita.com/HybridKotaro/items/1c46f5716f76312dd1d9

今回は、MVCモデルやデータベースについて学んでいきます。

<h1>MVCを理解する</h1>
<h3>1.1モデルを生成する</h3>
まずModelとはデータを表現するためのクラス。
RailsではActiveRecordと呼ばれる機能を利用してデータベースとやり取りができる。
まずはコマンドでModelを生成する

```
$rails generate model Article title:string body:text
```

複数ファイルができるが今回は以下の2つのファイルを使用する
①マイグレーションファイル：db/migrate/~_create_articles.rb
②モデルファイル：app/models/article.rb


<h3>1.2データベースマイグレーション</h3>
・マイグレーションは、<font color="red">データを保持したまま、テーブルの作成・変更を行う</font>こと。
・Railsでは<font color="red">ActiveRecordという機能がSQLを自動生成</font>する。

1.1で生成されたマイグレーションファイルを開いてみる。

```ruby:C：\blog\db\migrate\20210618121610_create_articles.rb
class CreateArticles < ActiveRecord::Migration[6.1]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end
```

createブロック内には1.1で宣言したArticleという名前のテーブルをtitleとbodyカラムで生成するように記述がしてある。
実際にコマンドでマイグレーションを実行する。

```
$rails db:migrate
```

成功すると次のような表示になる。

```
== 20210618121610 CreateArticles: migrating=================
-- create_table(:articles)
   -> 0.0026s
== 20210618121610 CreateArticles: migrated (0.0028s) =======
```

これでデータベースにArticleテーブルが追加されているはず。
確認するには以下のコマンドを実行する。

```
$rails dbconsole
```

↓SQLiteが起動

```
sqlite>.schema articles
```

↓結果

```
CREATE TABLE IF NOT EXISTS "articles" ("id" integer PRIMARY KEY AUTOINCREMENT NOT 
NULL, "title" varchar, "body" text, "created_at" datetime(6) NOT NULL, "updated_at" datetime(6) NOT NULL);
```

しっかりとマイグレーションしたテーブルが追加されているのがわかる。
ちなみにテーブル名はmodel生成時に変換されて複数形になっています。

<h3>1.3モデルを用いてデータベースをやりとりする</h3>
ここではRailsコンソールを使用する。
RailsコンソールはコマンドラインでRailsアプリケーションとやり取りをすることが出来る。内部的にはIRBを使用している。
以下のコマンドでコンソールを起動する

```
$rails console
```

実行後以下のようなコンソールが表示される。

```
Loading development environment (Rails 6.1.3.2)
irb(main):001:0> 
```

コマンドラインから先ほど作成したArticleオブジェクトを以下のように初期化する。(※１)

```
irb> article = Article.new(title: "Hello Rails", body: "I am on Rails!")
```

すると次のように結果が出ます。

```irb:
irb(main):001:0> Article.new(title: "Hello Rails", body: "I am on Rails!")        
   (0.6ms)  SELECT sqlite_version(*)
=> 
#<Article:0x0000018e32014020
 id: nil,
 title: "Hello Rails",
 body: "I am on Rails!",
 created_at: nil,
 updated_at: nil>
```

この時点では<font color="red">初期化されただけの状態でありデータベースに保存されていません。</font>

実際に確認してみます。
$rails dbconsoleでsqlite3を起動して次のコマンドを実行します。

```
sqlite>select * from articles;
```

すると何も表示されません。初期化されただけで保存されてないことが確認できます。


次に(※１)で初期化した後にsaveメソッドを呼び出して保存します。

```irb:
irb(main):002:0> article.save
```

↓結果

```irb:
  TRANSACTION (0.1ms)  begin transaction
  Article Create (3.5ms)  INSERT INTO "articles" ("title", "body", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "hello rails"], ["body", "I am on Rails"], ["created_at", "2021-06-18 13:32:41.029865"], ["updated_at", "2021-06-18 13:32:41.029865"]]
  TRANSACTION (3.4ms)  commit transaction
=> true
```

これでインサート文が発行されました。
実際に確認してみます。
$rails dbconsoleでsqlite3を起動して次のコマンドを実行します。

```
sqlite>select * from articles;
```

↓結果

```
1|hello rails|I am on Rails|2021-06-18 13:32:41.029865|2021-06-18 13:32:41.029865
```

ちゃんと追加出来てます。

<h3>1.4記事のリストを表示する</h3>
次にデータベースに追加した記事を取り出せるようにindexアクションを編集します。

```rb:C：\blog\app\controllers\articles_controller.rb
class ArticlesController < ApplicationController
    def index
        @articles = Article.all
    end
end
```

コントローラー内のインスタンス変数(＠で始まる変数)はビューの中でも呼び出せる変数になります。
次はビューを編集します。

```erb:C：\blog\app\views\articles\index.html.erb
<h1>Articles</h1>

<ul>
  <% @articles.each do |article| %>
    <li>
      <%= article.title %>
    </li>
  <% end %>
</ul>
```

するとデータベースに入っている値がすべて出力されます。
画像はarticlesテーブルにさらに値を追加しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1600683/0ac62c3c-3267-0129-02a2-3b811e40fd45.png)

<h1>さいごに</h1>
最後まで閲覧ありがとうございました。
記録として投稿しているため、間違っている部分や嘘をついている部分があるかもしれません。
もしお気づきの点がございましたらコメント等で教えてください。
今後も自力でサイトが作れるようになるまで、ガイドに沿って理解を深めていこうと思います。