0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2021-06-18

はじめに

この記事はスキルアップを目的とした記録です。 分からない部分を自分なりに補足して書いてます。 前回は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で生成されたマイグレーションファイルを開いてみる。

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生成時に変換されて複数形になっています。

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アクションを編集します。
C:\blog\app\controllers\articles_controller.rb
class ArticlesController < ApplicationController
    def index
        @articles = Article.all
    end
end

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

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

さいごに

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?