一週間のカリキュラム 1週間で、Ruby 〜 Ruby on Railsまでを学ぶ
シリーズの3日目、今回はRailsの真骨頂というべきMVCについてです。
3日目の内容
- Ruby on Rails の基礎を抑える。
MVCとは
前回の
にて、コントローラー(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を知ることが出来たと思います。