FullStackEngineer 2022年2月6日更新

MVCについて

Index

一週間のカリキュラム 1週間で、Ruby 〜 Ruby on Railsまでを学ぶ

シリーズの3日目、今回はRailsの真骨頂というべきMVCについてです。

3日目の内容


MVCとは

前回の

Railsのインストールと初めてのページ表示

にて、コントローラー(C)とビュー(V)テンプレートで変数を表示しました。

文字通り

【C】はコントローラー、【V】はビューです。

今回は【M】にあたるモデルの部分を確認していきます。

Modelを作成する。

今回からArticles(記事) データをデータベースから読み出して表示するという機能を作っていきます。

公式チュートリアル部分

まずは同じ用にArticles関係のコントローラーやビュー、ルートを作成します。
$ bin/rails generate controller Articles index

次にモデルに関連する部分を作成します。
今回は title と記事(body)だけを持つ簡単なデータです。
$ bin/rails generate model Article title:string body:text

invoke  active_record
create    db/migrate/20220206115022_create_articles.rb
create    app/models/article.rb
invoke    test_unit
create      test/models/article_test.rb

作成されたモデルデータの確認

  • ① これはデータベースを作成するために必要なファイルです。 マイグレーションファイルと言います。 create db/migrate/20220206115022_create_articles.rb

ファイルの中身は下記の通りです。

class CreateArticles < ActiveRecord::Migration[7.0]
  def change
    create_table :articles do |t|
      t.string :title
      t.text :body

      t.timestamps
    end
  end
end
  • ② これがモデルファイルです。 これはDBから読み込んだデータをコントローラーに渡す為の物です。 create app/models/article.rb

モデルの中みは下記の通りです。

class Article < ApplicationRecord
end

③ テストファイルです。一旦スルーしてもOKです。 create test/models/article_test.rb

このままではまだ、データベースに記事データは作成されてません。

データベースを作成してみる。

他のフレームワークとかだとDBに接続するための設定(ホスト指定やID,パス指定など)が必要ですが、Railsは、sqlite3をデータベースとして使う事が出来ますので、下記のコマンド一つでDBが作成されます。

$ bin/rails db:migrate

== 20220206115022 CreateArticles: migrating ===================================
-- create_table(:articles)
   -> 0.0019s
== 20220206115022 CreateArticles: migrated (0.0020s) ==========================

実際の本番運用時には本番にあったDBとその設定を行う必要ありますが、今は割愛します。

データベースにデータを入れてみる。

DB自体は作成されましたが、このままでは中身は空です。 タイトルと内容をDBに入れる為のフォームもまだ作成されてません。

今回はRailsの機能にアクセスできる Rubyのirbのような物を使って、テスト用のデータを入れていきます。

irbと同じ用にコマンドラインからRailsの機能が利用できます。
$ bin/rails console

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

先程作成した,Articleで、新規にモデルデータを作成し、保存します。


article = Article.new(title: "タイトルです。", body: "内容だよ。") article.save

実際に下記のようになれば成功です。

① 
irb(main):001:0> article = Article.new(title: "タイトルです。", body: "内容だよ。")

   (1.8ms)  SELECT sqlite_version(*)
=> 
#<Article:0x000000010e12e468
...

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

  TRANSACTION (0.1ms)  begin transaction
  Article Create (2.1ms)  INSERT INTO "articles" ("title", "body", "created_at", "updated_at") VALUES (?, ?, ?, ?)  [["title", "タイトルです。"], ["body", "内容だよ。"], ["created_at", "2022-02-06 12:21:19.268057"], ["updated_at", "2022-02-06 12:21:19.268057"]]                                                          
  TRANSACTION (1.0ms)  commit transaction                          
=> true   

いくつか上記のようにデータを投入してみましょう。 実際にDBに入ってるか確認してみます。


① 記事全体を .allをつけて表示できます。  irb(main):007:0> Article.all() Article Load (0.1ms) SELECT "articles".* FROM "articles" => [#<Article:0x000000010e176b78 id: 1, title: "タイトルです。", body: "内容だよ。", created_at: Sun, 06 Feb 2022 12:21:19.268057000 UTC +00:00, updated_at: Sun, 06 Feb 2022 12:21:19.268057000 UTC +00:00>, #<Article:0x000000010e176ab0 id: 2, title: "タイトルです2。", body: "内容2だよ。", created_at: Sun, 06 Feb 2022 12:28:34.845948000 UTC +00:00, updated_at: Sun, 06 Feb 2022 12:28:34.845948000 UTC +00:00>] ② 記事1のみを表示するには .find(1)のように指定します。 irb(main):010:0> Article.find(1) Article Load (0.2ms) SELECT "articles".* FROM "articles" WHERE "articles"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] => #<Article:0x000000010ddc53d0 id: 1, title: "タイトルです。", body: "内容だよ。", created_at: Sun, 06 Feb 2022 12:21:19.268057000 UTC +00:00, updated_at: Sun, 06 Feb 2022 12:21:19.268057000 UTC +00:00>

これでテスト用のデータは投入完了です。 次に、コントローラーにモデルを設定して、ビューで表示してみましょう。

MVCの基本形

app/controllers/articles_controller.rb  に下記の内容を追加します。

class ArticlesController < ApplicationController
  def index
    #モデルを追加します。これは全記事を @articlesに読み込みます。
    @articles = Article.all()
  end
end

ビュー app/views/articles/index.html.erb は下記のようにします。 とりあえずタイトルだけを羅列して表示するようにします。

<h1>Articles</h1>

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

ここまで入力して http://localhost:3000/articles/index

を確認してみましょう。

ここまでで、Railsの基本であるMVCを知ることが出来たと思います。

最新記事一覧

続きを見る

関連コンテンツ

カテゴリー一覧

TOP フルスタックエンジニアを目指すに方々へ 会員などの権限がある仕様の実現について