Ruby on railsを趣味としている私ですが、今回はRailsをサーバー側アプリとして使用して、json形式のデータを返すAPIを構築してみました。ということで今回はViewは一切触りません!!!
RailsでAPIを作るメリットは??
APIと言うと、グーグルマップやiTunesなど、著名なものもたくさんありますが、基本的な構造は「HTTPリクエスト」を受けて結果を返すというものです。使ったことはあるけど作ったことはないと言う人も多いのではないでしょうか?
APIを自分で作るメリットというのは、Rails以外のアプリケーションと連携できるという点です。データベース周りなどをRailsでいじって、データを返すということができるので、最近必須とされてきているスマートフォンアプリを作るときなんかに重宝します。iPhoneなどのアプリに使われているSwiftなんかは、単体では外部と通信することができないので、Http通信を使ってAPIでデータベースと通信を行うなんてことができちゃいます。
1.まずはRailsのプロジェクトを作る。
Railsでプロジェクトを作りましょう。そのあと、scaffoldなんかを使って最低限のデータベースを一気に構築しちゃいます。
(この辺を本当は使いたいデータベース構造にしちゃえばいい)
$rails new Api_app
$cd Api_app
$rails g scaffold Product name:string price:integer category_id:integer
$rails g model Category name
これでデータベースが構築され、各モデルファイルは以下のようになります。
・category.rb
class Category < ActiveRecord::Base has_many :products end
・product.rb
class Product < ActiveRecord::Base belongs_to :category end
2.jbuilderというgemをインストールする。
railsに来たリクエストに対して、レスポンスをjson形式で返すためには、jsonbuilderと言うgemを使えば簡単です。
Gem fileに
gem ‘jbuilder’
と記述して、
$bundle install
を実行すれば、jbuilderのgemがインストールされるはずです。
3.ルーティング設定
scaffoldメソッドを使ったので自動でルーティングは設定されているとは思いますが、一応確認のために。
・routes.rb
Rails.application.routes.draw do resources :products end
4.jsonを返すためのアクションを記述
今回は、productのindexにアクセスした際に全データを返すことを目標とします。よって、indexアクションには以下のように記述します。
class Api::ProductsController < ApplicationController def index @products = Product.all respond_to do |format| format.html format.json end end ... end
format.htmlの部分を記述すれば、通常のurlでアクセスされた場合はhtmlを返す設定になります。format.jsonと記述すれば.jsonへアクセスされた場合json形式でデータを返す設定となります。
5.最後にjbuilderファイルを作成する。
最後に、json形式でデータを返すために、jbuilderファイルを作ります。view/product/index.json.jbuilderを作成し、以下のように記述します。
・index.json.jbuilder
json.array!(@products) do |product| json.extract! product, :id, :name, :price, :publised_at, :category_id json.url product_url(product, format: :json) end
まとめ
以上の手順で、$rails sをしサーバーを起動後、http://localhost:3000/products.jsonにアクセスすれば、データベースの中身がjson形式で帰ってきていることが確認できるかと思います。とても便利なので是非挑戦してみてください。