Railsに入る前にしっておきたいERBとActiveRecordのこと
これは何?
Rails をいきなり使うと覚えることが多くて大変!
ということで Rails をいきなりやる前に最低限の知識として
- ERB
- ActiveRecord
のことをちょっと紹介・説明をした記事となります
ちょっとだけ用語説明
ERBとは?
Embedded RuBy の略です。
これを使うことで、最終的に好きな ファイルの中の任意の箇所でRubyのコードを実行する ことができます。
ActiveRecordとは
Rails に標準で入っている Gem です。
主にデータベース(以下 DB) との接続から値の取得を行なってくれるORMです。
これを使うことで簡単に DB と Ruby の連携をすることができます
ERB
使い方
基本的な使い方は非常に簡単です。
まず使いたい Ruby ファイルで erb のライブラリを読み込みます。
ここでは例として erb_run.rb というファイルを作ってみて以下のコードを書いてみましょう
# erb の読み込み
require "erb"
これで使う準備が出来ました。
では実際に使ってみましょう。
まず以下のように文字列を渡してインスタンスを作成してください
# erb の読み込み
require "erb"
erb = ERB.new("好きな文字列")
そして .result メソッドを実行して結果を受け取ってください。
この .result の戻り値が、文字列内の Ruby コードが実行された結果となります。
実際に表示をしてみてください
# erb の読み込み
require "erb"
erb = ERB.new("好きな文字列")
puts erb.result
- 実行する
ruby erb_run.rb
# => 好きな文字列
好きな文字列 というのが表示されて入れば成功です!
Rubyコードを書いて使ってみる
ただ同じ文字列が返ってきただけじゃん!
ということで今度は実際に Ruby のコードを実行してみましょう。
ERB は特定のルールに従った記載をすることで、Ruby のコードを記載することができます。
詳しくは Googleで検索してみてください
下記のように erb_run.rb を変更して実行をしてみてください
# erb の読み込み
require "erb"
erb = ERB.new('はじめての <%= "erb".upcase %>の実行')
puts erb.result
- 実行する
ruby erb_run.rb
# => はじめてのERBの実行
<%= %> の中のRubyコードが実行されているのが確認できました。
このように文字列の中に存在する任意の Ruby コードを実行できるのが ERB の力です。
そして実際に Rails でもこの ERB が使われています。
HTMLにRubyコードを仕込んでみる
もう少し実際に使用されているような使い方をしてみます。
以下のように index.html を作って erb_run.rb と同じ階層に配置してください
<html>
<head>
</head>
<body>
<h1>はじめてのERB</h1>
<h2><%= "erb".upcase %>を実行する</h2>
<% 1.upto(3) do |num| %>
<p><%= num %></p>
<% end %>
</body>
</html>
では実際に上記の html の中に記載した Ruby コードを実行してみましょう。
erb_run.rb を以下のように変更して実行してください
# erb の読み込み
require "erb"
# index.html の中身を文字列で取得する
index_html = File.read("index.html")
# ERB実行
erb = ERB.new(index_html)
puts erb.result
- 実行する
ruby erb_run.rb
# =>
<html>
<head>
</head>
<body>
<h1>はじめてのERB</h1>
<h2>ERBを実行する</h2>
<p>1</p>
<p>2</p>
<p>3</p>
</body>
</html>
上記のように html の中の Ruby コードが実行されたのが確認できました。
ERBまとめ
-
ERBを使うと文字列に存在するRubyコードを実行することができる - そのときは
ERBが用意した記法通りにRubyコードを記載する必要がある -
ERBとFile.readなどの任意のファイルを文字列で読み込む処理を使うとhtmlやymlなどの外部ファイルのRubyコードを実行することができる
Railsへの補足
実際に Rails では app/views の下に ERB で変換するファイルを配置します。
その際、それが erb で使用されることがわかるように拡張子の最後に .erb を付けています
- 例:
app/views/users/index.html.erb
Rails では最終的にレンダリングされる html は ERB が実行した結果のものとなります
※ちなみに config/database.yml も ERB が実行された結果になるのですが、こいつは 何故か erb が付いてないです
追記
上記ですが @scivola さんより補足を頂きました。
Rails が拡張子で処理方法を判断する必要がないためではないか、ということです。コメントを読んで私もそうではないかと思いました。
詳しくはコメント欄を参照ください
ActiveRecord
DBの環境構築
何はともあれ DB が必要です。
Docker でもなんでも良いので DB を用意してください。
Dockerで準備
ここでは一応 Docker の MySQL を使う前提でいきます。
以下のようにコマンドを実行して mysql に接続をしてください
# mysql イメージ取得
docker pull mysql
# コンテナ化
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -d -p 13306:3306 mysql
# 確認
docker ps
# => CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# => XXXXXXXXXXXX mysql "docker-entrypoint.s…" 2 seconds ago Up 1 second 33060/tcp, 0.0.0.0:13306->3306/tcp mysql
# 接続
mysql -h 127.0.0.1 -u root -P 13306 -p
# => Enter password: (rootと入力)
mysql>
データベースとテーブルとレコードを作成する
SQL を使って以下のデータベースとテーブルを作成しましょう
- データベース:
active_record_test - テーブル:
users
mysql> CREATE DATABASE active_record_test;
# =>Query OK, 1 row affected (0.01 sec)
mysql> CREATE TABLE active_record_test.users (id INT, name VARCHAR(10), age INT, created_at DATETIME, updated_at DATETIME);
# =>Query OK, 0 rows affected (0.02 sec)
これで環境構築は完了です
使ってみる
Gemインストール
では ActiveRecord を使ってみましょう。
まず ERB と違い ActiveRecord は Gem ですので、インストール作業が必要です。以下のコマンドを実行して activerecord をインストールしてください
gem install activerecord
※最新の activerecord は Ruby version >= 2.4.4 を要求してくるので古い Ruby を使っている型はインストールするバージョンを下げるか Ruby バージョンをあげててください
また今回は MYSQL を使うので MYSQL を使うための Gem もインストールが必要です。
gem install mysql2
※mysql2 は mysql コマンドが使えないとインストールに失敗するのでホスト側で mysql を使うために必要なモジュール一式を入れておいてください
ファイル作成1
ここでは例として ar_run.rb というファイルを作ってみて以下のコードを書いてみましょう
※arは ActiveRecord の頭文字からとってきました
# activerecord の読み込み
require "active_record"
# mysql2の読み込み
require "mysql2"
これで使う準備が出来ました。
では実際に使ってみましょう。
DBとの接続設定
まず以下のようにDBとの接続設定を記載します
# activerecord の読み込み
require "active_record"
# mysql2の読み込み
require "mysql2"
# DB接続設定
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
database: "active_record_test",
host: "127.0.0.1",
port: "13306",
username: "root",
password: "root",
)
これで接続設定ができました
実際に users テーブルを使ってみる
以下のように ActiveRecord::Base を継承したクラスを作成します。
そしてそのクラスで接続したいテーブル名を記載します。
# activerecord の読み込み
require "active_record"
# mysql2の読み込み
require "mysql2"
# DB接続設定
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
database: "active_record_test",
host: "127.0.0.1",
port: "13306",
username: "root",
password: "root",
)
class User < ActiveRecord::Base
self.table_name = "users"
end
これで下準備は完了です!
保存処理
さっそくDBにレコードを保存してみましょう
idが 1, 名前が banana, 年齢が 12 のレコードを作ってみます
# activerecord の読み込み
require "active_record"
# mysql2の読み込み
require "mysql2"
# DB接続設定
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
database: "active_record_test",
host: "127.0.0.1",
port: "13306",
username: "root",
password: "root",
)
class User < ActiveRecord::Base
self.table_name = "users"
end
puts User.create(id: 1, name: "banana", age: 12)
- 実行する
ruby ar_run.rb
# => #<User:0x(ランダムな値)>
と表示されていたら作成成功です。実際にmysqlに接続してテーブル確認してみてください
mysql> SELECT * FROM active_record_test.users;
+------+--------+------+---------------------+---------------------+
| id | name | age | created_at | updated_at |
+------+--------+------+---------------------+---------------------+
| 1 | banana | 12 | 201x-xx-xx xx:xx:xx | 201x-xx-xx xx:xx:xx |
+------+--------+------+---------------------+---------------------+
1 row in set (0.01 sec)
上記にように出力されていれば成功です!
※created_at, updated_at には activerecord が自動的に値を入れてくれています!
取得する
今度は先ほど作ったレコードを取得してみます
# activerecord の読み込み
require "active_record"
# mysql2の読み込み
require "mysql2"
# DB接続設定
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
database: "active_record_test",
host: "127.0.0.1",
port: "13306",
username: "root",
password: "root",
)
class User < ActiveRecord::Base
self.table_name = "users"
end
# id が1のレコードを一件取得する
user = User.find_by(id: 1)
# テーブルのカラム名と同じメソッドを呼び出すと、取得したレコードの値を返してくれる
puts user.id
puts user.name
puts user.age
- 実行する
ruby ar_run.rb
# => 1
# => banana
# => 12
上記のように出力されていれば成功です!
ActiveRecordまとめ
-
ActiveRecordを使うとDBに値を保存したり、値を取得したりすることが簡単にできる - そのときは
ActiveRecord::Baseを継承したクラスを作成する- 取得など方法はたくさんあるのでGoogleで検索してみてください
Railsへの補足
-
ActiveRecordを使うために作成されるクラスが以下のときはself.table_nameを省略できます- テーブル名の単数形のクラス名となっている
-
Userクラスとusersテーブル、など
-
- テーブル名の単数形のクラス名となっている
-
RailsではActiveRecord::Base.establish_connectionで使用する接続設定はconfig/database.ymlに記載します -
Railsではこうしたクラスはapp/modelsに配置します- 例:
app/models/user.rb
- 例:
複合技
これらを複合して users テーブルのレコードの名前一覧を表示させるには以下のようにすればできます
<html>
<head>
</head>
<body>
<h1>ユーザ一覧</h1>
<% @users.each do |user| %>
<p><%= user.name %></p>
<% end %>
</body>
</html>
# erb の読み込み
require "erb"
# activerecord の読み込み
require "active_record"
# mysql2の読み込み
require "mysql2"
# DB接続設定
ActiveRecord::Base.establish_connection(
adapter: "mysql2",
database: "active_record_test",
host: "127.0.0.1",
port: "13306",
username: "root",
password: "root",
)
class User < ActiveRecord::Base
self.table_name = "users"
end
# users テーブルのレコードを全て取得する
@users = User.all
# users_index.html.erb の中身を文字列で取得する
index_html = File.read("users_index.html.erb")
# ERB実行
erb = ERB.new(index_html)
puts erb.result
- 実行する
ruby ar_erb_run.rb
# =>
<html>
<head>
</head>
<body>
<h1>ユーザ一覧</h1>
<p>banana</p>
</body>
</html>
まとめ
-
Railsを使う前に必要となるERBとActiveRecordの簡単な仕組みを説明しました -
RailsはこうしたGemやライブラリが複合的に使われてアプリケーションの作成がされています