[Rails]既存DBを操作するAPIを作成する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

Railsの勉強もかねてRESTfulなAPIを作ろうとしてみました。
そういった際に、0からテーブル構造を考えて、
モデルを作って・・・と言った教科書通りのやり方をやっていくといった方法があります。
今回は、Railsを用いてRESTfulなAPIを作る事を目標の為、
WordPressを立ち上げて、テーブルの設計やテーブルに対する操作はそれを参考にする事にしました。

そのため、今回の記事の内容は以下の通りになります。

  • WordPressの環境を構築する。
  • 上記で構築したテーブルをRailsから接続し、APIを作成していく。

WordPressの環境を構築する

今回はWordPressが利用するテーブルを作成する事が目標のため、
Webサーバーも適当に立ててしまいます。
PHP 5.4.0からビルドインサーバーがあるため、
それを用いる事で容易にPHPが動くWebサーバーが立ち上がります。
以下の行程でWordPressのセットアップ画面が立ち上がる事が確認できるかと思います。

$ wget http://ja.wordpress.org/wordpress-3.9.1-ja.zip
$ unzip wordpress-3.9.1-ja.zip
$ cd wordpress
$ php -S localhost:28080
$ open http://localhost:28080

MySQLのセットアップに関しては以下の記事を参考にしました。

Homebrew で MySQL をインストール | Deblog

$ brew install mysql
$ mysql_install_db --verbose -user=$(whoami) --basedir="$(brew --prefix mysql)" --datadir=/usr/local/var/my
$ mysql.server start
$ mysql_secure_installation

あとはWordPress用のデータベースを作成し、
WordPressのセットアップを完了させる事でテーブルが作成され、
ユーザー・記事・コメント等データが入った状態となります。

WordPressのテーブルをRailsから接続し、APIを作成する

前準備

Railsプロジェクトを作成し、config/dbtabase.ymlを作成します。
設定内容としては、developmentで先ほど作ったWordPressのDBと接続できる設定をします。

その後、以下のコマンドを実行する事で、db/schema.rbが生成されます。

$ rake environment -v -t RAILS_ENV=development db:schema:dump

model

app/models/wp_user.rb

class WpUser < ActiveRecord::Base
end
[/ruby]

<p>テーブルを参照するモデルは以上で作成完了です。<br>
私が作っていた際も半信半疑では有ったのですが、<br>
以下の方法で確かめたところ本当にできてました。</p>


<p>DBに対して、SQL文が発行されて情報が取得されているのがわかるかと思います。</p>

<h3>route</h3>
<h4>config/routes.rb</h4>

Rails.application.routes.draw do
   resources :wp_users,only: [:index]
end

resourcesはRESTfulなURLを自動生成してもらえるとのこと。 既存DBとつないで情報を返すところまでを目標にしているので、 一覧画面の生成までとしました。

resources - リファレンス - Railsドキュメント

以下で確認ができます。

$ rake routes
  Prefix Verb URI Pattern         Controller#Action
wp_users GET  /wp_users(.:format) wp_users#index

controller・view

./app/controllers/wp_users_controller.rb

class WpUsersController < ApplicationController def index @wp_users = WpUser.all end end [/ruby]

./app/views/wp_users/index.json.jbuilder

json.array!(@wp_users) do |wp_user|
  json.extract! wp_user, :ID, :user_login, :display_name
end

確認

ブラウザでアクセスしても良いのですが、
jsonが返ってくる事の確認なのでcurlを用いて確認しました。

$ rails server

別コンソールにて

$ curl http://localhost:3000/wp_users.json
[{"ID":1,"user_login":"CM_Kajiwara","display_name":"CM_KajiwaraCustom"}]%

まとめ

既存のDBに対して、容易にアクセスできました。
既存のアプリのDBから情報を抽出してAPIとして提供すると言ったケースで利用できるのではないでしょうか。 今回のケースではTable名規則がModelの複数形とすると言ったRailsの規則にもそっていたので、
ModelにTable名を指定すると言った事は不要でした。
しかし、既存のアプリのテーブル名称によってはそういったも対応が必要なようです。
rails 既存DBを使ってrailsしてみた。 - 日々の記録。