今回はRuby on Railsのでモデルの作成とデータベースの利用の部分をやろうと思います。
最終的にはECサイトを作成したいと思います。
環境
OS/ミドルウェア | バージョン |
---|---|
CentOS | 7.2.1511 |
ruby | 2.4.2p198 |
Rails | 5.1.4 |
データベースの設定ファイル
まずは設定ファイルを変更したいと思います。設定内容は自分の環境に設定して下さい。
config/database.yml
[ファイルの編集]
1 |
$ vi config/database.yml |
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
# MySQL. Versions 5.1.10 and up are supported. # # Install the MySQL driver # gem install mysql2 # # Ensure the MySQL gem is defined in your Gemfile # gem 'mysql2' # # And be sure to use new-style password hashing: # http://dev.mysql.com/doc/refman/5.7/en/old-client.html # default: &default adapter: mysql2 encoding: utf8 pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %> username: 自分の環境に設定 password: 自分の環境に設定 socket: /var/lib/mysql/mysql.sock development: <<: *default database: online_shop_development # 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: online_shop_test # As with config/secrets.yml, you never want to store sensitive information, # like your database password, in your source code. If your source code is # ever seen by anyone, they now have access to your database. # # Instead, provide the password as a unix environment variable when you boot # the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database # for a full rundown on how to provide these environment variables in a # production deployment. # # On Heroku and other platform providers, you may have a full connection URL # available as an environment variable. For example: # # DATABASE_URL="mysql2://myuser:mypass@localhost/somedatabase" # # You can use this database configuration with: # # production: # url: <%= ENV['DATABASE_URL'] %> # production: <<: *default database: online_shop_production username: online_shop password: <%= ENV['ONLINE_SHOP_DATABASE_PASSWORD'] %> |
default: &defaultに記載してある[username、password]しか変更していません。
設定ファイルは「development」「test」「production」の3つのモードに分かれており、開発用、テスト用、本番用、で異なる設定が出来るようになっています。MySQLを利用する場合はユーザー名やパスワードの設定も加わります。
データベースの作成
それではまずデータベースを作成します。使用するデータベースの種類はSQLiteやMySQLなどがありますが、Railsアプリケーションからデータベースを作成する場合は、ターミナルを起動しアプリケーションルートに移動してから次のようにコマンドを実行すればデータベースが作成されます。
[データベース作成]
1 |
$ rake db:create |
[実行結果]
1 2 |
Created database 'online_shop_development' Created database 'online_shop_test' |
データベースが作成されたか確認します。ターミナルからデータベースに接続します。
[データベース接続]
1 2 |
$ rails dbconsole Enter password: パスワードを入力 |
[データベース確認]
1 |
mysql> show databases; |
[実行結果]
1 2 3 4 5 6 7 8 9 10 |
+------------------------------+ | Database | +------------------------------+ | information_schema | | mysql | | online_shop_development | | online_shop_test | | performance_schema | | sys | +------------------------------+ |
[online_shop_development、online_shop_test]が作成されました。
モデルの作成
ではモデルを作成します。アプリケーションのルートディレクトリに移動し、次のようにコマンドを実行して下さい。
1 |
$ rails generate model モデル名 |
モデルを作成するとマイグレーションファイルと呼ばれるテーブルの作成や更新のためのファイルも自動的に作成されます。
今回は「user」モデルを作成してみます。
いくつかのファイルが作成されていますが「app/models/user.rb」が作成したモデルに関して記述されたファイルとなります。
それでは作成された「user.rb」ファイルを開いてみます。
[ファイルの中身]
1 2 |
class User < ApplicationRecord end |
名前が「モデル名」のクラスが定義されます(モデル名の先頭は大文字となります)。
タイムゾーンにJSTを使用する方法
config/application.rb
[ファイルの編集]
1 |
$ vi config/application.rb |
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
require_relative 'boot' require 'rails/all' # Require the gems listed in Gemfile, including any gems # you've limited to :test, :development, or :production. Bundler.require(*Rails.groups) module OnlineShop class Application < Rails::Application # Initialize configuration defaults for originally generated Rails version. config.load_defaults 5.1 // 追加 config.time_zone = 'Tokyo' // 追加 config.active_record.default_timezone = :local # Settings in config/environments/* take precedence over those specified here. # Application configuration should go into files in config/initializers # -- all .rb files in that directory are automatically loaded. end end |
これでDBにデータを入れた時に日本の時刻になります。
マイグレーションを使ったテーブル作成
モデルを作成した時に「db/migrate/20171214084316_create_users.rb」というファイルも作成されています。これはマイグレーションスクリプトと呼ばれるファイルと呼ばれているものです。
マイグレーションに関して簡単にご説明をしておきます。データベースは既に作成していますが、データを格納するにはテーブルを作成しなければなりません。Railsとは関係無くデータベースの持つ機能を使ってテーブルを作成することはもちろん可能です。ただRailsではテーブルの作成や変更の仕組みとしてマイグレーションと呼ばれる機能が提供されています。
マイグレーションとは、例えばテーブルを作成するのに直接作成するのではなく、テーブルを作成するというスクリプトファイルを作成した上で、そのスクリプトを実行することでテーブルを作成するものです。なぜこのような手間をかけるのかと言えば、(1)テーブルに関して行なった処理を記録し、元に戻したり別の環境で同じ処理を簡単に行なわせることができる、(2)データベースの種類に関係無く同じスクリプトでテーブルを作成できる、といった利点があります。
[ファイルの編集]
1 |
$ vi db/migrate/20171214084316_create_users.rb |
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
class CreateUsers < ActiveRecord::Migration[5.1] def change create_table :users do |t| // 追加 t.string :email, index: { unique: true }, :null => false, comment: "メールアドレス" // 追加 t.string :password, :null => false, comment: "パスワード" t.timestamps // 追加 t.datetime :deleted_at end end end |
これでマイグレーションの準備はできました。ではアプリケーションルートに移動してから次のようにコマンドを実行してマイグレーションスクリプトを実行して下さい。
[テーブルを作成]
1 |
$ rake db:migrate |
[実行結果]
1 2 3 4 |
== 20171214084316 CreateUsers: migrating ====================================== -- create_table(:users) -> 0.0191s == 20171214084316 CreateUsers: migrated (0.0191s) ============================= |
[テーブルの確認]
1 2 3 4 5 6 7 |
+-----------------------------------+ | Tables_in_online_shop_development | +-----------------------------------+ | ar_internal_metadata | | schema_migrations | | users | +-----------------------------------+ |
「users」と「schema_migrations」「ar_internal_metadata」という3つのテーブルが作成されていることが分かります。「users」はマイグレーションスクリプトを実行して作成したテーブルです。また「schema_migrations」はどのマイグレーションスクリプトまで実行済みなのかを記録するためのテーブルです。「ar_internal_metadata」はenvironmentの情報を保持しているだけみたいです。
詳しくはコチラ参照→Rails5でDBに自動生成されるテーブル、”ar_internal_metadata” とは何なのか
今回作成したマイグレーションスクリプトはテーブルを作成するものですので、スクリプトを実行するとデータベースの中にテーブルが作成されます。
テスト用データの作成
モデルの作成とデータベース側で必要なテーブルの作成までは完了しました。簡単なサンプルを作成するために、テーブルにいくつかデータを登録しておきます。
Railsではテーブルにデータを登録する仕組みが用意されています。「db」ディレクトリの中に「seeds.rb」というファイルが作成されています。
1 2 3 4 5 6 |
total 20 drwxrwxr-x 3 uchida uchida 4096 Dec 14 18:35 . drwxrwxr-x 13 uchida uchida 4096 Dec 14 14:37 .. drwxrwxr-x 2 uchida uchida 4096 Dec 14 21:53 migrate -rw-rw-r-- 1 uchida uchida 1194 Dec 14 21:01 schema.rb -rw-rw-r-- 1 uchida uchida 370 Dec 14 13:33 seeds.rb |
[ファイルの編集]
1 |
$ vi seeds.rb |
・データを1つずつ入れるパターン
[記載方法]
1 |
モデルクラス名.create(:カラム名1 => 値1, :カラム名2 => 値2, ...) |
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 11 |
# This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). # # Examples: # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) // ↓これ以降追加 # coding: utf-8 User.create(:email => 'test1@gmail.com', :password => '123456') |
・データを複数入れるパターン
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 11 12 13 |
# This file should contain all the record creation needed to seed the database with its default values. # The data can then be loaded with the rails db:seed command (or created alongside the database with db:setup). # # Examples: # # movies = Movie.create([{ name: 'Star Wars' }, { name: 'Lord of the Rings' }]) # Character.create(name: 'Luke', movie: movies.first) // ↓これ以降追加 # coding: utf-8 5.times do |index| User.create(email: "test#{index}@gmail.com", password: "password#{index}") end |
「user」モデルの「create」メソッドを使いテーブルにデータを追加します。
※ 日本語を使用する場合はファイルの先頭に「# coding: utf-8」を忘れないようにして下さい。
ではアプリケーションルートに移動してから先程記述したスクリプトを実行して下さい。
[テーブルにデータを入れる]
1 |
$ rake db:seed |
[実行結果]
何も表示されない。エラーが出なければOK。
「users」テーブルにデータが登録されたか確認します。ターミナルからデータベースに接続します。
[データベース接続]
1 2 |
$ rails dbconsole Enter password: パスワードを入力 |
[DB選択]
1 |
mysql> use online_shop_development; |
[データの取得]
1 |
mysql> select * from users; |
[実行結果]
1 2 3 4 5 6 7 8 9 10 |
+----+-----------------+-----------+---------------------+---------------------+------------+ | id | email | password | created_at | updated_at | deleted_at | +----+-----------------+-----------+---------------------+---------------------+------------+ | 1 | test0@gmail.com | password0 | 2017-12-15 09:51:02 | 2017-12-15 09:51:02 | NULL | | 2 | test1@gmail.com | password1 | 2017-12-15 09:51:03 | 2017-12-15 09:51:03 | NULL | | 3 | test2@gmail.com | password2 | 2017-12-15 09:51:03 | 2017-12-15 09:51:03 | NULL | | 4 | test3@gmail.com | password3 | 2017-12-15 09:51:03 | 2017-12-15 09:51:03 | NULL | | 5 | test4@gmail.com | password4 | 2017-12-15 09:51:03 | 2017-12-15 09:51:03 | NULL | +----+-----------------+-----------+---------------------+---------------------+------------+ 5 rows in set (0.01 sec) |
「users」テーブルに5つのデータが登録されました。
これで、テスト用データの作成は終了です。
モデルを使ってデータベースのデータを取得
それではモデルを使ってデータベースのデータを取得してみます。まずアクションメソッドを書き換えます。「app/controllers/shopping_controller.rb」ファイルを編集します。
今回は既存の「index」アクションを使います。次のように編集して下さい。
[ファイルの編集]
1 |
$ vi shopping_controller.rb |
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 11 12 |
class ShoppingController < ApplicationController def index // 追加 @users = User.all end def commodity render plain: '商品を購入する処理' end end |
「User」モデルの「all」メソッドはテーブルに含まれる全てのデータをモデルクラスのオブジェクトの配列として返します。今回は返された配列を変数「users」に格納しています。
続いてビューを編集します。「app/views/shopping/index.html.erb」ファイルを編集下さい。
[ファイルの編集]
1 |
$ vi index.html.erb |
[ファイルの中身]
1 2 3 4 5 6 7 8 9 10 |
<h1>Hello</h1> <p> 現在登録されているユーザは次のとおりです。 </p> <p> <% @users.each do |user| %> [メールアドレス] <%= user.email %>, [パスワード] <%= user.password %><br /> <% end %> </p> |
アクションから渡されてきたモデルクラスのオブジェクトの配列の数だけ順にメールアドレスとパスワードを取得して画面に表示します。
動作確認
それではRailsアプリケーションを起動してここまでの動作を確認してみます。ターミナルを起動し、起動させたいアプリケーションのルートディレクトリに移動して下さい。そして「rails server -b 0.0.0.0」と実行して下さい。
[Railsサーバ起動]
1 |
$ rails server -b 0.0.0.0 |
ブラウザから次のURLへアクセスして下さい。
1 |
http://☓☓☓.☓☓.☓☓☓.☓☓:3000/ |
「shopping」コントローラの「index」アクションが呼び出され、アクションの中でモデルを使ってデータベースからデータを取得し、最終的に対応するビューが呼び出されて画面に次のように表示されます。
このようにモデルを利用してデータベースからデータを取得し、そのデータを使った結果を利用者のブラウザ上に表示させることができました。
以上でサンプルアプリケーションを使った動作確認は完了です。
Ruby on Rails5でコントローラーからテンプレートの表示
Ruby on Rails5でモデルの作成とデータベースの利用
Ruby on Rails5でBootstrap4デザインにする
Ruby on Rails5で検索フォームと一体型になった検索ボタン作成方法
Ruby on Rails5でFontAwesomeを導入する方法(アイコンが使用可能)
Ruby on Rails5でBootstrap4のナビゲーションバーを使用する方法
Ruby on Rails5でBootstrap4のナビゲーションバーに画像(ロゴ)を設置
Ruby on Rails5でBootstrap4を使用しながらCSSを使用する
Ruby on Rails5でBootstrap4のドロップメニューをホバー表示する方法
Ruby on Rails5でBootstrap4のドロップメニューログインアイコンを作成
Ruby on Rails5でBootstrap4のドロップメニューでカートアイコンを作成
Ruby on Rails5でBootstrap4のドロップメニューで注文履歴を作成