はじめに
この記事はスキルアップを目的とした記録です。 分からない部分を自分なりに補足して書いてます。 前回はRailsを使ってローカル環境でHelloRailsを実行しました。
今回は、MVCモデルやデータベースについて学んでいきます。
MVCを理解する
1.1モデルを生成する
まずModelとはデータを表現するためのクラス。 RailsではActiveRecordと呼ばれる機能を利用してデータベースとやり取りができる。 まずはコマンドでModelを生成する$rails generate model Article title:string body:text
複数ファイルができるが今回は以下の2つのファイルを使用する
①マイグレーションファイル:db/migrate/~_create_articles.rb
②モデルファイル:app/models/article.rb
1.2データベースマイグレーション
・マイグレーションは、データを保持したまま、テーブルの作成・変更を行うこと。 ・RailsではActiveRecordという機能がSQLを自動生成する。1.1で生成されたマイグレーションファイルを開いてみる。
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生成時に変換されて複数形になっています。
1.3モデルを用いてデータベースをやりとりする
ここではRailsコンソールを使用する。 RailsコンソールはコマンドラインでRailsアプリケーションとやり取りをすることが出来る。内部的にはIRBを使用している。 以下のコマンドでコンソールを起動する$rails console
実行後以下のようなコンソールが表示される。
Loading development environment (Rails 6.1.3.2)
irb(main):001:0>
コマンドラインから先ほど作成したArticleオブジェクトを以下のように初期化する。(※1)
irb> article = Article.new(title: "Hello Rails", body: "I am on Rails!")
すると次のように結果が出ます。
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>
この時点では初期化されただけの状態でありデータベースに保存されていません。
実際に確認してみます。
$rails dbconsoleでsqlite3を起動して次のコマンドを実行します。
sqlite>select * from articles;
すると何も表示されません。初期化されただけで保存されてないことが確認できます。
次に(※1)で初期化した後にsaveメソッドを呼び出して保存します。
irb(main):002:0> article.save
↓結果
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
ちゃんと追加出来てます。
1.4記事のリストを表示する
次にデータベースに追加した記事を取り出せるようにindexアクションを編集します。class ArticlesController < ApplicationController
def index
@articles = Article.all
end
end
コントローラー内のインスタンス変数(@で始まる変数)はビューの中でも呼び出せる変数になります。
次はビューを編集します。
<h1>Articles</h1>
<ul>
<% @articles.each do |article| %>
<li>
<%= article.title %>
</li>
<% end %>
</ul>
するとデータベースに入っている値がすべて出力されます。
画像はarticlesテーブルにさらに値を追加しています。