Vagrant/AmazonLinux2 – rbenv/Rubyインストール

概要

VagrantのAmazonLinux2仮想環境にrbenv&Rubyをインストールした記録。

  • ホスト:Windows10
  • ゲスト:Vagrant + VirtualBox + bento/amazonlinux-2

Gitのインストール

CentOS7仮想環境と同じ方法でGitをインストール。

バージョン確認

rbenv/Rubyのインストール

CentOS7仮想環境と同じ方法でインストール・設定(ライブラリーのインストールも含む)。

  • Gitからrbenvをクローン
  • .bash_profileの設定
  • Gitからruby-buildをクローン
  • Rubyに必要なライブラリーをインストール

Rubyインストール時に最新バージョンではなく過去のバージョンを指定してインストール。

  • rbenv install --list-allで全バージョンを確認
  • Rubyのインストール時に、バージョンを指定してインストール
  • rbenv globalで通常使うバージョンを指定

 

Vagrant – 仮想環境構築 – Amazon Linux 2

概要

クラウドで利用していたAWS(Amazon Web Service)のEC2/Cloud9の環境をVagrantでローカルに構築した記録。利用時の環境に併せて、OS、MySQL、Ruby、Railsのバージョンをできるだけ整合させた。

オリジナルの環境

  • OS : Amazon Linux AMI release 2018.03
  • MySQL : mysql Ver 14.14 Distrib 5.5.62, for Linux (x86_64) using readline 5.1
  • Ruby : ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
  • Rails : Rails 5.1.7

構築した環境

  • OS(Box) : bento/amazonlinux-2 (virtualbox, 1.2.1)
  • MySQL : Ver 14.14 Distrib 5.5.62, for Linux (x86_64) using readline 5.1
  • Ruby : ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-linux]
  • Rails : Rails 5.1.7

Vagrant/VirtualBoxの導入

Vagrant – 仮想環境構築 – CentOS7を参照。

Boxの導入

ダウンロード

vagruntupFind Boxesでキーワードamazonを含むBoxを検索し、bento/amazonlinux-2(1.2.1)を選択。

このBoxをvagrant addコマンドでローカルに追加。

仮想環境の初期化

ディレクトリー\vagrant\amazonlinux2を作成・移動し、vagrant initでダウンロードしたBoxで環境を構築。

仮想環境の利用

仮想環境の起動

vagrant upコマンドで仮想環境を起動。初回起動時は多数のパッケージインストールや依存関係の解決で時間がかかる。

仮想環境へのログイン

vagrant sshコマンドで仮想環境にログイン。EC2のロゴが表示される。

システム情報

リリースの表現が違っている。

構築したシステム情報

オリジナルのシステム情報

ロケールとタイムゾーンの設定

確認

タイムゾーンがUTC、ロケールはLANG=enになっている。

ロケールの設定

ロケールをJPに設定して再起動。表現は日本語になるが、まだタイムゾーンはUTC。

timedatectlで現在のロケールを確認。UTC。

タイムゾーンの設定

timedatectl list-timezonesで設定可能なタイムゾーンを確認。

タイムゾーンをAsia/Tokyoに設定。

その他の設定

共有設定、Atomでの接続はCentOS7と同じ手順で完了。

 

Rails – タイムゾーン

概要

Railsでモデルのデータをデータベースに保存した時、OSやMySQLのタイムゾーンはJSTなのに、created_atupdated_atの時刻がUSTで保存されているのに気付いた。

以下の2つの方法があるようだ。

  • データベースへの登録時刻をJSTにする方法
  • データベースへの時刻登録はUSTとし、表示をJSTにする方法

日本以外でも利用するデータベースの時刻を統一するにはUSTの方がよさそうなので、ここでは2つ目の方法を用いた。

  1. プロジェクトのconf/application.rbに1行追加
    • config.time_zone = ‘Tokyo’
  2. サーバーが実行中の場合は再起動

これでデータベース上はUST、Railsでの扱いはJSTになる。

データベースへの記録はUST

文字列フィールドを1つ持つテスト用のモデルを生成・マイグレートする。

この操作は21時過ぎに実行したが、マイグレーションファイルの時刻が12時台で、9時間遅れているのでUSTとわかる。

なお。CentOSとMySQLのタイムゾーンはTokyoに設定されている。

mysqlにテーブルが作られている。

コントローラーを編集して、トップページ表示時にレコードを保存し、改めて読み込んで表示させる。

データベースへの書き込み時と読み込み時の時刻がUSTになっている。

mysqlで登録されたレコードを確認すると、USTで保存されている。

application.rbでタイムゾーンを設定

プロジェクトのconfig/aplication.rbに以下の1行を追加。

Railsサーバーを立ち上げなおして実行すると、表示がJSTになっている。

 

Rails – formヘルパーとCSRF対策

formヘルパーから生成されるタグ

たとえばfomr_tagヘルパーがレンダリングされると、formタグとhidden属性のinputタグが生成される。

CSRF対策

form系のヘルパーで生成されるhiddenタイプのinputタグは、authenticity_tokenという名前でランダム文字列を値に持つ。

これはフォームに対する送信を確認するもので、Railsから送ったフォーム以外からの送信を排除するための仕掛け。

CSRF(Cross Site Request Forgeries)は、攻撃者のサイトへのリンクをクリックした場合に、そのサイトから意図しない送信が送られてしまうもの。

Railsではformヘルパーで生成されたトークンとサーバー内に持っているトークンが符合すれば、意図したフォームからの投稿と判断される。このためのメソッドがprotect_from_forgery

Rails 5.2より前は、ApplicationControllerprotect_from_forgeryが自動的に記述される。

Rails 5.2以降はActionController::Baseで有効になっていて、追加記述の必要はない。

 

Rails – モデルによるDB操作の仕組み

概要

モデルによるデータベース操作を、できるだけ基本的な方法で行うことを試した。

またテーブル構造の変更に対して、マイグレーションを行わずにmysqlコンソールとコントロールファイル編集だけで対応できることを確認した。

モデルとテーブルの生成

モデルの生成

以下の様にモデルを生成する。このモデルは文字列型のフィールドを1つ持っている。

rails generate model record col1:string

app/models/record.rbが作成される。

マイグレーションファイルも作成されていて、string型のフィールドが定義されている。

マイグレーション~テーブル生成

このモデルからマイグレーションによりテーブルを生成する。

rails db:migrate

mysqlでテーブルが生成されていることと、そのテーブルの構造が確認できる。

モデルの構造の確認

コントローラーからモデルの内容を出力させる。

トップページを出力させると、サーバー実行中のコンソールに以下が出力される。

Railsデフォルトのid、created_at、updated_atに加えてcol1が要素に加わっている。

データの登録確認

トップページアクセス時にレコードを1つ登録する。レコードのフィールドはハッシュで指定する。

Railsサーバーのコンソールに以下が出力され、データが生成・登録されていることがわかる。

mysqlでもテーブルへの登録状況が確認できる。

データの読み込み確認

トップページ読み込み時にデータベースを読み込んで表示するように変更する。

出力は以下のとおりで、データベースの内容が読みだされている。

MySQLでのテーブル変更

以下の様にmysqlで直接テーブルにフィールドを加える。

Railsで変更後テーブルへの書き込み

トップページアクセス時に、フィールド追加後のテーブルに新たなデータを書き込むように変更。

トップページ表示時にデータが登録され、テーブルは以下の様に更新されている。

 

Rails – プロジェクトでのデータベース準備

概要

Railsでモデルによりフォームやデータベースとのやり取りをする流れ。

  1. プロジェクト生成時にDBMSを指定
  2. database.ymlを編集してデータベースを生成
  3. モデルを生成
  4. マイグレーションでテーブルを生成
  5. モデルでフォームデータを取得
  6. モデルでテーブルを読み書き

プロジェクト生成時

プロジェクト生成時にDBMSを指定する。

  • Rails2.0.2以降ではデフォルトデータベースがMySQLからSQLiteに変更
  • MySQLを使う場合、プロジェクト生成時に以下の様に指定

rails generate project_name -d mysql
rails generrate project_name --database=mysql

データベースの生成・操作

database.ymlの編集

config/database.ymlファイルの内容を設定・変更

データベースの生成

以下のコマンドでdatabase.ymlの設定に従ってデータベースを生成。

rails db:create

データベースの確認

以下のいずれかの方法で、アプリケーションのデータベースを確認できる。

  • mysql -u user -pを実行してMySQLのコンソールに入る
  • プロジェクトディレクトリー内でrails dbconsoleを実行して、アプリケーションが使うデータベースをuseした状態でMySQLのコンソールに入る

データベースの削除

以下のコマンドでアプリケーションで使っているデータベースが削除される。有無を言わさずすべてのテーブルごと消えてしまうので注意。

rails db:drop

実行例

database.yml

データベース名を設定する。以下はdemo_appアプリケーションでdemo_app_dbを使う設定。

データベースの生成

rails db:createコマンドでdatabase.ymlの設定を使ってデータベースを作成する。

rails dbconsoleコマンドでデータベースが作成されたことを確認。

Rails – ヘルパーメソッド

主なヘルパーメソッド

link_to

<a>要素を生成する。

基本形

<%= link_to "表示テキスト", URL %>

  • <a href=URL>表示テキスト</a>を生成
  • URLは文字列形式のほか、routes.rbas:指定をしたパス(***_path)を指定可能

属性の追加

<%= link_to text, URL, :attr_name => 'attr_value' %>

  • たとえばid属性の場合、:id => 'ID'など
  • 複数の属性をカンマで区切って列挙できる

フォーム関係

Vagrant – コマンド

Vagrant全般

ヘルプ・コマンド一覧

コマンド全体

  • vagrant -h
  • vagrant --help

サブコマンド

  • vagrant help command

Vagrantのバージョン確認

  • vagrant -v
  • vagrant --version

Box関係

Boxの一覧

  • vagrant box list

Boxの追加・削除

  • vagrant box add **/**
  • vagrant box add virtual_name box_name.box
  • vagrant box remove **/**
  • vagrant box remove box_name --box-version ****.**
  • Box削除の前にvagrant destroyで仮想マシンを削除する

Boxの更新

対象の仮想環境のディレクトリー内で実行。

  • vagrant box update

バックアップ/リストア

  • vagrant package box_name
    →現在の仮想環境をバックアップ
    →カレントディレクトリーにpackage.box作成
  • vagrant package box_name --output buckup_name.box

リストアはaddの後init。

  • vagrant add box_name backup_name.box
    →仮想環境ディレクトリーに移動
    vagrant init box_name

仮想マシン操作

仮想マシン操作は仮想マシンのディレクトリー内で。

仮想環境の一覧・動作状況

  • vagrant global-status

仮想マシンの初期化~vagrantfile作成

  • vagrant init box_name

仮想マシンの起動・停止・確認

仮想マシンに関する操作は仮想マシンのディレクトリー内で。

  • vagrant up
  • vagrant halt
  • vagrant restart
  • vagrant status

仮想マシンへの接続/接続情報確認

  • vagrant ssh
  • vagrant ssh-config

仮想マシンの削除

  • vagrant destroy id
    • idvagrant global-statusで確認
    • Boxを削除する前に仮想マシンを削除する

Snapshot~スナップショット

  • 対象の仮想マシンのvagrantfileがあるディレクトリーで実行
  • vagrant haltで停止しなくても、snapshot実行時に一時仮想マシンを停止して再起動してくれる

スナップショットの保存

vagrant snapshot save snapshot_name

スナップショットの一覧

vagrant snapshot list

スナップショットの復元

vagrant snapshot restore snapshot_name

スナップショットの削除

vagrant snapshot delete snapshot_name

 

Rails – DB操作~基礎的な読み書き

概要

  • Railsでデータベースを操作する場合、フォームの入力~モデル~データベースを自動で関連付ける方法が一般的
  • ここでは、モデルオブジェクトを直接操作してデータベースとの間での書き込み・読み込み処理を整理する

手順

書き込み

手順は以下の通り。

  1. カラム=プロパティーを指定してモデルインスタンスを生成
    • @model_name = ModelName.new(col1: val1, ...)
  2. インスタンスメソッドsaveでデータベースに書き込み
    • @model_name.save
  3. 結果として返されるtrue/falseに応じて必要な処理を行う

読み込み

全データを読み出す場合、モデルクラスのクラスメソッドallを使う。

  • @model_names = ModelName.all

この変数をviewなどで利用するときは、各フィールドをプロパティーとして参照する。

  • @model_names.col1

 

Rails – モデル生成とマイグレーション

概要

Railsでは、データベースのテーブルをモデルを通して扱う。そのための開発時点での操作は以下のとおり。

  1. モデルの生成・操作
  2. マイグレーションによるテーブルの生成・操作

モデルの生成・削除

モデルの生成

テーブルに対して1つのモデルを生成する。

基本形は以下のコマンド。

rails generate model model_name

生成時にテーブルのフィールド名とフィールドの型を指定する場合(フィールド指定の間はスペース)。

rails generate model model_name col1:type col2:type ... 

フィールドの型

  • primary_key
  • binary, boolean
  • date, datetime, time, timestamp
  • decimal, float, integer
  • string, text

生成されるファイル

実行後、モデルクラスとマイグレーションの2つのクラスファイルが生成される。

モデルクラスファイル

app_name/app/models/model_name

  • ファイルの内容はクラス定義
  • クラス名はモデル名のパスカルケース(ModelName)
  • ApplicationRecordを継承

マイグレーションファイル

app_name/db/migrate/yyyymmddhhmmss_create_model_name.rb

  • テーブルを扱うマイグレーションクラスが定義される
  • マイグレーションクラスはActiveRecordモジュールのMigrationクラスを継承している
  • マイグレーションクラスのクラス 名はCreateModelNames
    • パスカルケース
    • 最後にsがついた複数形
  • マイグレーションクラスのcreate_tableはDSL(ドメイン固有言語、Railsdoc)
    • テーブル名はスネークケースでモデル名の複数形
    • 生成時にフィールド名と型を指定した場合、create_tableブロック内でフィールドが定義される

モデルの削除

モデルの削除は以下のコマンドで、モデルクラスファイルとマイグレーションファイルが削除される。

rails destroy model model_name

ただしデータベース上のテーブルは削除されない。

テーブルの生成・削除

テーブルの生成

以下のコマンドで、マイグレーションファイルの設定に従ってデータベースにテーブルが生成される。

rails db:migrate

モデル生成時にフィールドを指定しなかった場合やモデル生成後にフィールドを追加する場合は、マイグレーションファイルにフィールドを追加する。

一度migrateした後にマイグレーションファイルを修正して再度migrateしても反映されない。一旦rails db:rollbackでテーブル生成前の状態に戻してからマイグレーションファイルを修正して再度実行。

テーブルの削除

ロールバック

  • rails db:rollbackで直前に生成したテーブルを削除

MySQLでの削除

  • MySQLのコンソールでDROP TABLEを実行

マイグレーション

model_nameモデルのmodel_namesテーブルを例にとる。

  • model_nameモデルを削除
    • rails destroy model model_name
  • 以下のコマンドでダミーのマイグレーションファイルを生成
    • rails generate migration 任意の名前
  • マイグレーションファイルのdef changeブロックに以下を追加
    • drop_table: model_names
  • rails db:migrationを実行
  • db/migrate/マイグレーションファイルを削除

実行例

 モデルの生成

demo_recordという名前でモデルを生成する。このモデルはname:stringage:integerの2つのフィールドを持つモデルを生成する。

モデルファイル

モデルファイルがapp/modelsの下に作成される。モデルファイル名はモデル生成時のモデル名のスネークケースになっている。

モデルファイルの内容はモデルクラスの定義で、生成当初は空の定義。モデルクラス名がモデル名のパスカルケースになっている。

マイグレーションファイル

マイグレーションファイルがdb/migrateの下に作成される。

マイグレーションファイルの内容はテーブル生成クラスの定義で、create_tableブロックの中でフィールドの名前と型を指定している。

  • モデル名demo_recordに対して生成されるテーブルクラス名はCreateDemoRecordsで、接頭辞Createにモデル名に複数形のsがついたパスカルケース
  • create_tableブロックでフィールドの型とフィールド名を定義

テーブルの生成~マイグレーション

rails db:migrateコマンドにより、マイグレーションファイルの設定に基づいてテーブルを生成する。

rails dbconsoleでテーブルが生成されていることを確認する。

生成されたテーブルの構成を確認。

マイグレーションの状態確認

db:migration:statusでマイグレーションの状況を確認できる。部分的にロールバックした時などの確認に便利。

ロールバック

すべてロールバック

rails db:rollbackにより、いったんテーブル作成前の状態に戻す。

MySQLで確認すると、テーブルはなくなっている。

ロールバックステップ指定

rails db:migrate STEP=nでロールバックするステップ数を指定可能。STEPは大文字でないと機能しない。

 

マイグレーションファイルへの追記

マイグレーションファイルに新たなフィールドを1行追加する。

再度マイグレート。

MySQLで確認すると、テーブルが作成されている。

新たなフィールドが追加されているのが確認できる。