ようへいの日々精進XP

よかろうもん

Sinatra + ActiveRecord + SQLite3 でシンプルな RESTFul API サーバー (っぽいもの) を作った

はじめに

作ったもの

github.com

なんで作ったのか

データベースの検証にあたり, 実際のアプリケーションからデータベースの書き込み、更新、削除する状況を用意したかったので.

実装メモ

ActiveRecord すごいなあ

自分で 1 bit もデータベースを意識した実装 (データベースへの接続ハンドリングとか SQL とか)を書かなくても良いところに驚いた.

models/topic.rb を以下のように.

require 'active_record'
require 'mysql2'
require 'sqlite3'

ActiveRecord::Base.configurations = YAML.load_file('database.yml')
ActiveRecord::Base.establish_connection(ENV['ENV'].to_sym)
class Topic < ActiveRecord::Base
end

これを書いて, アプリケーションに require するだけ.

...
require './models/topics'

get '/topics' do
  content_type :json, :charset => 'utf-8'
  params['limit'] == nil ? limit = 10 : limit = params['limit']
  topics = Topic.order("created_at DESC").limit(limit)
  topics.to_json(:root => false)
end

...

テーブルにデータを書き込むのは, 以下のように Topic クラスのインスタンス作ってからのテーブルアトリビュート名のインスタンスメソッドを呼び出して、最後に save メソッドを呼ぶだけ.

...
  topic = Topic.new
  topic.title = title
  topic.description = description
  topic.save
...

なんということでしょう...

このあたりの実装については, メタプログラミング Ruby に書かれているので改めて読んでみたい.

www.oreilly.co.jp

Minitest の setup と teardown

setup と teardown はテストケース毎に呼ばれるので注意する...

require 'minitest/autorun'

class SampleTest < MiniTest::Unit::TestCase
  def setup
    p 'setup'
  end

  def teardown
    p 'teardown'
  end

  def test_foo
    assert_equal 'foo', 'foo'
  end

  def test_bar
    assert_equal 'bar', 'bar'
  end
end

実行すると以下のように.

$ bundle exec ruby test/sample_test.rb
MiniTest::Unit::TestCase is now Minitest::Test. From test/sample_test.rb:3:in `<main>'
Run options: --seed 5712

# Running:

"setup"
"teardown"
."setup"
"teardown"
.

Finished in 0.001742s, 1147.8691 runs/s, 1147.8691 assertions/s.

2 runs, 2 assertions, 0 failures, 0 errors, 0 skips

ふむふむ.

おわり

やっと...

データベースの検証を始めることが出来る...

頑張ったところ

いつもなら、挫折してしまうんだけど...インテグレーションテストを追加したところ.

以上。