前記事
概要
今回はモデルの作成と、データベースへのアクセスまでを行います。
データベースの設定
Railsのプロジェクトを作成する際、明示的にデータベースを指定しない場合はSQLiteを使用するよう設定され、その設定は[アプリケーションルート\config\database.yml]に保存されます。
前回までの記事で作成したプロジェクトはデータベースを特に指定していない為、SQLite用の設定ファイルが作成されており、内容は以下の通りです。
#SQLite version 3.x
#gem install sqlite3
#
# Ensure the SQLite 3 gem is defined in your Gemfile
# gem 'sqlite3'
#
default: &default
adapter: sqlite3
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
timeout: 5000
development:
<<: *default
database: db/development.sqlite3
#Warning: The database defined as "test" will be erased and
#re-generated from your development database when you run "rake".
#Do not set this db to the same as development or production.
test:
<<: *default
database: db/test.sqlite3
production:
<<: *default
database: db/production.sqlite3
設定ファイルを見ると、「development:」、「test」、「Production」の三つに分かれています。それぞれ開発用、テスト用、本番用となっており、異なる設定が出来るようになっています。
デフォルトでは「開発モード」が使われるようになっており、開発モードのDBファイルは[アプリケーションルート\db\]に[development.sqlite3]という名前で作成されています。
(この時点では0バイトのファイル)
データベースの作成
コマンドプロンプトでアプリケーションルートに移動し、railsの以下のコマンドでデータベースを作成可能。
bundle exec rake db:create
コマンド実行後、以下のようにtest.sqlite3が新たに作成されています。
モデルの作成
アプリケーションルートで以下のコマンドを実行します。
bundle exec rails generate model list
[test]の部分がモデル名です。
コマンドを実行するといくつかのファイルが作成されますが、[アプリケーションルート\app\models\list_test.vb]がモデルについて記述されたファイルです。
ここでモデル名に[-](ハイフン)を使用してはいけません。SQLiteの命名規約では禁止されている文字のため、modelとクラス名が正しく作成されなくなるようです。
上記画面にあるtest_tbl.rbが[-]を使用して作成したmodelですが、名称が[_](アンダーバー)に変わっており、ファイル中のクラス名は[TestTbl]となっており、統一されていない状態になってしまいました。
[list.rb]の中身は以下のようになっています。
class List < ApplicationRecord
end
モデルはApplicationRecordを継承したクラスとして作成されています。
テーブル作成
モデルを作成した時に、[20181107114709_create_lists.rb]というファイルも作成されています。このファイルは「マイグレーションスクリプト」と呼ばれるファイルです。
マイグレーションとは、データベースの操作を直接行うのではなく、スクリプトファイルを作成して実行することでテーブルの操作を行うものです。
- テーブルに関して行う処理を記録しておくことで、元に戻したり他の環境で同じ処理を行ったりできる。
- データベースの種類(SQLite、MySQL等)に関係なく同じスクリプトでテーブルを作成できる。
等のメリットがあります。
ファイルを開くと、以下のような内容が記述されています。
class CreateLists < ActiveRecord::Migration[5.2]
def change
create_table :lists do |t|t.timestampsend
end
end
end
ここに追加したいフィールドを記述してやります。
class CreateLists < ActiveRecord::Migration[5.2]
def change
create_table :Lists do |t|t.string :name
t.timestampsend
end
end
end
変更したファイルを文字コードUTF-8で保存します。
その後アプリケーションルートに移動してから以下のコマンドを実行することで、マイグレーションスクリプトが実行されます。
bundle exec rake db:migrate
これでlistsテーブルが作成されました。
データ作成
次はlistsテーブルにレコードを追加します。
[アプリケーションルート\db]フォルダの中に[seeds.rb]というファイルが作成されていますので、テキストエディタで開き、以下の3行を追加します。
# coding: utf-8
List.create(:name => 'ほげ' )
List.create(:name => 'ほげほげ' )
追加後、コンソールで以下のコマンドを入力します。
bundle exec rake db:seed
これで2つのレコードが追加されました。
次はレコードが正しく追加されているか確認します。
アプリケーションルートで次のコマンドを入力してください。
bundle exec rails dbconsole
プロジェクトで使用している設定に合わせて、データベースのコンソールが起動されます。今回のプロジェクトではSQLiteを使用しているため、上記のようにSQLiteのコンソールが起動されます。
ここで以下のSQL文を実行してテーブルの内容を確認します。
select * from lists;
テーブルの内容が表示され、2行が追加されている事が確認できます。コンソールは「ctrl+z」を入力してEnterキーで抜ける事が出来ます。
なお追加したname以外にも列がありますが、これはマイグレーションスクリプトに最初から記述されていた
t.timestamps
という1行で、レコードの作成日時、更新日時を格納する為に2つの列を作ってくれるからです。
データ取得と表示
データベースから情報を取得し、画面への表示を行います。
まず[アプリケーションルート\app\controllers]にある[testlist_controller.rb]を編集し、「hello」アクションを以下のように変更します。
def hello
@lists = List.all
end
「List」モデルの「all」メソッドでテーブルに含まれる全てのデータを返します。取得したデータを変数「lists」に格納しています。
続いてビューの編集です。[アプリケーションルート\app\views\testlist]にある[hello.html.erb]を以下のように編集します。
<p>
現在のデータ内容は以下の通りです。
</p>
<p>
<% @lists.each do |list| %>
[名前] <%= list.name %>
<% end %>
</p>
データの件数分表示処理を繰り返して、name列の内容を表示します。
動作確認
動作の確認を行います。アプリケーションルートで以下のコマンドを入力し、サーバーを起動してください。
bundle exec rails s
サーバー起動後、ブラウザで「localhost:3000/testlist/」にアクセスします。
データ件数分のデータが表示されました。
コメント