【Sinatra】Active Recordを使ってアプリを作成1

SinatraでActive Recordを使ってアプリを作成していきます。

Gemfileの作成

まず、任意のフォルダを作成し、そのディレクトリ直下でbundle init を実行し、Gemfile を作成します。

Gemfile

source 'https://rubygems.org'  

gem 'sqlite3'  
gem 'rake'  
gem 'sinatra'  
gem 'sinatra-contrib'  
gem 'sinatra-reloader'  
gem 'sinatra-activerecord', path: ".."  
gem 'activerecord'  
gem 'pry'  
gem 'pry-byebug'  

bundle install で、gemfileに記述されている内容をインストールします。

アプリケーションファイルの作成

同じディレクトリ直下に、app.rb ファイルを作成します。

app.rb

require 'rubygems'  
require 'bundler'  
Bundler.require  

get '/' do  
    'test'  
end  

アプリケーションファイルの実行

では、アプリケーションファイルを実行してみます。

コマプロを開き、アプリケーションファイルのディレクトリまで移動してください。

$ ruby app.rb コマンドを実行し、http://localhost:4567/ を開くと、アプリケーションファイルが実行され、testという文字が出力されてるかと思います。

Viewの作成

アプリケーションフォルダのディレクトリ直下に、views フォルダを作成します。

viewsフォルダの直下に、index.erb ファイルを作成します。

#内容は後程記述します  

Sinatraでも、Railsと同じようにlayoutがサポートされています。
layoutファイルも簡単に作成してみましょう。

layout.erb

<body>  
  <%= yield %>  
</body>  

<%= yield %> を指定することで、ここにerbファイルの中身を挿入することができます。

Rakeファイルの準備

RakeコマンドでActive Recordを実行するために、Rakeファイルを準備します。

require './app'  
require 'sinatra/activerecord/rake'  

それに伴い、sinatra/activerecord/rake にあたるフォルダとファイルを作成します。

こちらを参照してください。

#databaseの設定

アプリケーションフォルダ直下のディレクトリにconfig フォルダを作成し、database.yml ファイルを作成します。
このdatabese.yml がデータベース設定をする際に読み込まれます。


sqlite: &sqlite  
  host: 127.0.0.1  
  adapter: sqlite3  

development:  
  <<: *sqlite  
  database: db/development.sqlite3  

production:  
  <<: *sqlite  
  database: db/production.sqlite3  

test:  
  <<: *sqlite  
  database: db/test.sqlite3  

#DBの設定

では、Active Recordを使用して、DBの準備をしましょう。

このブログが分かりやすいです。
http://ataru-kodaka.hatenablog.com/entry/2014/07/22/212526
https://masaqu.id/posts/2019-06-26_sinatra-activerecord/

##マイグレーションファイルの作成

$ bundle exec rake db:create_migration NAME=create_users  

このコマンドで、マイグレーションファイルを作成することが出来ます。

NAME=create_users でUserテーブルを作成することが出来るようになります。語尾は必ず複数形にしましょう。

20190828012739_create_users.rb のような日付付きのファイルが作成されるかと思います。

class CreateUsers < ActiveRecord::Migration[6.0]  
  def change  
    create_table :users do |t|   
      t.string :name  
      t.string :email  
      t.string :password_digest  
    end  
  end  
end  

マイグレーションファイルの中身を編集します。

ActiveRecord::Migration[6.0]は、Active Recordのverを指定します。(指定しなければマイグレーションを実行することができません)

また、t.string :~~~ で、Userテーブルに設定するカラムを決めることができます。

マイグレーションの実行

マイグレーションを実行しましょう。(2回以上同じ状態で実行しないようにしてください。)

$ bundle exec rake db:migrate

これでDBにテーブルの作成とカラムの設定が出来ました。

アプリケーションファイルの設定

アプリケーションファイルはこのようになっていたかと思いますが、Modelの設定等を追記していきます。

app.rb

require 'rubygems'    
require 'bundler'    
Bundler.require    
get '/' do    
    'test'    
end    

全貌は下記の通りになることを予定しています。

require 'rubygems'  
require 'bundler'  
require 'sinatra'  
require 'active_record'  
require 'sinatra/activerecord'  

Bundler.require  



ActiveRecord::Base.establish_connection(  
  adapter: 'sqlite3',  
  database: './db/development.sqlite3'  
)  

class User < ActiveRecord::Base  
end  

get '/' do  
    @users = User.all  
    erb :index  
end  

まず、

ActiveRecord::Base.establish_connection(  
  adapter: 'sqlite3',  
  database: './db/development.sqlite3'  
)  

このコードですが、ActiveRecordの接続の設定をしています。
データベースはsqlite3 で、./db/development.sqlite3 のファイルを参照していますよってことです。

bundle exec rake db:migrate:status で設定ファイルを見つけることができます。

次に

class User < ActiveRecord::Base    
end    

こちらはRailsでいうところのモデルです。同じファイルに記述しています。(アプリの規模が大きくなれば別ファイルにモデルを作成してもいいですね。)

get '/' do    
    @users = User.all    
    erb :index    
end    

こちらの、User.all は、Userテーブルから全てを持ってきています。そして@users@ を変数の前に付けることで、erbファイルに変数の中身を渡すことが出来ます。

先ほど作成したindex.erbファイルを見てみましょう。

index.erb

<% @users.each do |user| %>  
    <div><%= user.name %></div>  
    <div><%= user.email %></div>  
<% end %>  

こういう記述の方法はRailsと全く同じですね。

データを用意する

dbフォルダ直下にseeds.rb ファイルを作成します。

seeds.rb

User.create!(  
  [  
    {  
        name: 'Taro',  
        email: 'Taro@gmail.com',  
        password_digest: 'taeo',  
    },  
    {  
      name: 'Hanako',  
      email: 'Hanako@gmail.com',  
      password_digest: 'hanako',  
    }  
  ]  
)  

bundle exec rake db:seed を実行すると、seeds.rbの内容がDBに取り込まれます。

出力確認

$ ruby app.rb  

でアプリケーションファイルを実行しましょう。

http://localhost:4567

にアクセスするとデータが反映されています!

まとめ

マイグレーションファイルを実行後はほとんどRailsと同じでしたね!