Skip to content

Railsでデータベースにアクセスする。#

データベースとは、アプリケーションの情報を保存・取得する場所です。 Railsでデータベースにアクセスするためにはモデル、Modelを作ると便利です。

一般的にModelとは、システム上の登場人物(登場するモノ)を指します。

Railsでも、Modelは登場人物単位で作ると良いです。 例えば予約システムだと、Modelには「お客様」と、「予約」という登場人物があり、 「お客様」には、氏名、電話番号、アカウント名があり、 「予約」には、日時、注文内容がある、 ような感じです。

ここでは、「お客様」情報としてUser Modelを作ってみます。

前提#

もし、Railsプロジェクトが手元になければ、こちらの手順でRailsプロジェクトを用意してください。

User Model作成#

Modelのためのファイルを作成していきます。 Ruby上でデータを扱うためのModelと、DBを設定するためのMigrationファイルを作成します。 最初に、Modelの内容と型を考えます。 お客様には、氏名(文字列)電話番号(文字列)、アカウント名(文字列) があるとします。

まずは、Migrationファイルを作成します。 db/migrate ディレクトリを作成して、その中に {年月日時分秒}_create_users.rb を作成してくだささい。 というファイルを作成してください。 {年月日時分秒}は今の時間を入れてください。2020年07月25日04時49分53秒だとしたら 20200725044953 です。大体の時間でいいです。 ファイルの内容は以下です。

class CreateUsers < ActiveRecord::Migration[5.2]
  def change
    create_table :users do |t|
      t.string :name
      t.string :tel
      t.string :account_name

      t.timestamps
    end
  end
end

クラス名は、ファイル名の{年月日時分秒} のあとの文字列の、_の後の文字を大文字にした名前である必要があります。 _ 区切りの文字列をスネークケース、大文字区切りをキャメルケースと呼びます。

さらに、app/models ディレクトリに user.rbを以下の内容で作成します。

class User < ApplicationRecord
end

これでModelが作成されました。

(蛇足ここから) 実は、これらのファイルは、ターミナルで、

rails generate model Usern name:string tel:string account_name:string

と実行すると、テストファイルとともに生成されます。 ここでは、Railsの仕組みを知っていただくために手で作っていただきました。 (蛇足ここまで)

db関連のファイルを作成したら、ターミナルのプロジェクトのホームディレクトリ(rails new . を実行したディレクトリ)で、以下のコマンドを実行します。このコマンドにより

rails db:migrate

このコマンドにより、migrationファイルが読み込まれて、データベースにデータを保存する場所が作られました。

データの作成、参照、更新、削除#

これでデータの作成、参照、更新、削除ができるようになりましたので、Controllerを作成して、それらの機能を呼んでいきます。 app/controllers ディレクトリに user_controller.rb を作成します。

class UserController < ApplicationController
  def create
    if params[:name].blank? || params[:tel].blank? || params[:account_name].blank? 
      render status: 400, json: { status: 400, message: 'Bad Request' }
      return
    end
    user = User.new(name: params[:name].to_s, tel: params[:tel], account_name: params[:account_name])
    user.save!()
    render :json => user
  end
  def refer
    users = User.all
    render :json => users
  end
  def referOne
    if params[:id].blank?
      render status: 400, json: { status: 400, message: 'Bad Request' }
      return
    end
    begin
      user = User.find(params[:id].to_i)
      render :json => user
    rescue
      render status: 404, json: { status: 404, message: 'Not Found' }
    end
  end
  def update
    if params[:id].blank?
      render status: 400, json: { status: 400, message: 'Bad Request' }
      return
    end
    begin
      user = User.find(params[:id].to_i)
      if params[:name]
        user.name = params[:name]
      end
      if params[:tel]
        user.tel = params[:tel]
      end
      user.save!()
      render :json => user
    rescue
      render status: 404, json: { status: 404, message: 'Not Found' }
    end
  end
  def delete
    if params[:id].blank?
      render status: 400, json: { status: 400, message: 'Bad Request' }
      return
    end
    User.find(params[:id]).destroy
    render body: nil
  end
end

Railsには色々と便利な仕組みがあるのですが、何をやっているかわかるように、できるだけ使わずに作っています。 UserControllerには5つのメソッドを作りました。 create  新規作成 refer  全件取得 referOne 一見取得 update 更新 delete 削除 各メソッドの中で、Modelに対して処理を実行しています。どんなふうに呼び出しているかはソースコードを呼んでみてください。

後はconfig/routes.rb に以下の行を追加します。

Rails.application.routes.draw do
  # 省略
  # ここから
  get '/api/users/create', to: 'user#create'
  get '/api/users', to: 'user#refer'
  get '/api/users/:id', to: 'user#referOne'
  get '/api/users/:id/update', to: 'user#update'
  get '/api/users/:id/delete', to: 'user#delete'
  # ここまでをendの前に追記
  # 省略
end

本当であれば、getメソッド以外にも、postメソッド、putメソッド、deleteメソッドを使うとスマートなのですが、 今回はブラウザから簡単に呼び出せるように、全てgetメソッドで追加してあります。

ターミナルでrailsを起動します。railsディレクトリで以下のコマンドを実行してください。

rails s

では、最初にデータを作成します。 ブラウザで以下のURLにアクセスしてみてください。

[http://localhost:3000/api/users/create?name=比古清十郎&tel=000(0000)0000&account_name=hiko]{http://localhost:3000/api/users/create?name=%E6%AF%94%E5%8F%A4%E6%B8%85%E5%8D%81%E9%83%8E&tel=000(0000)0000&account_name=hiko)

すると、以下のような表示がされたと思います。

{"id":1,"name":"比古清十郎","birth":null,"age":null,"rank":null,"created_at":"2020-07-25T15:03:36.588Z","updated_at":"2020-07-25T15:03:36.588Z","account_name":"hiko","tel":"000(0000)0000"}

idや時間はこれとは異なっているかもしれません。

[http://localhost:3000/api/users/]{http://localhost:3000/api/users/) では一覧が、 [http://localhost:3000/api/users/1]{http://localhost:3000/api/users/1) では、1件取得ができます。(最後の数字は、作成時に得られたidを入れてください。)

[http://localhost:3000/api/users/1/update?name=弥彦&tel=111(1111)1111]{http://localhost:3000/api/users/create?name=%E6%AF%94%E5%8F%A4%E6%B8%85%E5%8D%81%E9%83%8E&tel=111(1111)1111) とすると、更新されたJSONが表示され、再び [http://localhost:3000/api/users/1]{http://localhost:3000/api/users/1) をブラウザで表示すると、情報が更新されているのがわかります。

さらに [http://localhost:3000/api/users/1/delete]{http://localhost:3000/api/users/1/delete) をブラウザで表示すると、データが削除され、

[http://localhost:3000/api/users/]{http://localhost:3000/api/users/) 一覧から該当のidのデータが削除されています。

これでRailsでデータを扱うことができました。 次はVueという仕組みを使って画面を作っていきましょう!