Sinatra+ActiveRecord環境で開発するためのメモ

ちょっとしたデータベースアプリケーションを作る必要があって Rails を触ってみたのだけど、 英語アレルギーよろしくRailsアレルギーで吐きそうになった

体調を壊すほどなら致し方ないと、別のフレームワークとしてSinatraを選択
シンプルなCRUDアプリケーションだけど勉強のためActiveRecord も使えるように


必要なgemをインストール

まずはGemfileに必要な gem を追加

Gemfile

gem 'sinatra'
gem 'sinatra-contrib'

gem 'rake'
gem 'sqlite3'
gem 'activerecord'
gem 'sinatra-activerecord'

bundle installする

最初は --path の指定を忘れないようにする
bundle installするときはpathを指定しよう


rakefileを作る

プロジェクト直下に rakefile を新しく作る

ActiveRecordで使うコマンドを使えるように rakefile に以下を追加

/rakefile

require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'

これで ActiveRecordに関する rake が使えるように


マイグレーションする

$ bundle exec rake db:create_migration NAME=create_posts

出来上がった /db/migrate/20190626061350_create_posts.rb に以下を追加
※ 日時スタンプ_指定NAME.rb

class CreatePosts < ActiveRecord::Migration[5.2]
  def change
    create_table :posts do |t|
      t.string :title
      t.string :content
      t.timestamps
    end
  end
end

ActiveRecordにバージョン指定してあげないとエラー吐くので 環境に応じて適宜追加する

とりあえず今回試しに作ったのは 件名・内容 のデータを持ったシンプルなもの
テーブル名はブログにならって Posts に


Modelを作る

命名規則はRailsにならって テーブル名を複数形、モデル名を単数形に

/models フォルダ作って post.rb を配置
中身はコレだけ

/models/post.rb

ActiveRecord::Base.establish_connection('sqlite3:///model.db')
class Post < ActiveRecord::Base 
end

rakefile から /models/post.rbを読み込めるように

/rakefile

require 'sinatra/activerecord'
require 'sinatra/activerecord/rake'
require './models/post.rb' #追加した

db:migrateする

$ bundle exec rake db:migrate

テーブルが出来た。


仮データを作る

db:seedを使って初期データをいれてみる

/db以下にseeds.rbを作る
テストだけなので中身は適当に

/db/seeds.rb 

Post.create!(
  [
    {
      title: 'TITLE_1',
      content: 'CONTENT_1',
    },
    {
      title: 'TITLE_1',
      content: 'CONTENT_1',
    }
  ]
)

db:seed の実行

$ bundle exec rake db:seed

データが入った。


webページで中身を表示して確認してみる

とにかく posts の中身を表示させて見てみる

main.rb

require 'sinatra'
require 'sinatra/activerecord'
require "./models/post.rb"

get "/posts/?" do
  Post.all.to_json
end

get "/posts/:id" do |id|
  Post.find(id).to_json
end

出来た。