手取り足取りプログラミング

cloud9、railsについて自分がつまずいた所を詳しく説明します。なぜなら一番読み返すのは自分だから。

【Rails】ActiveResourceを使ってAPIを利用する方法

RailsでActiveResourceを利用してAPI を使う方法をまとめます。
今回はホットペッパーのグルメサーチAPIを使用します。

この記事はCloud9で下記記事の通り設定した前提で進めます。
yonayonaru.hatenablog.com

リクルートWEBサービスに登録する

登録方法

リクルートWEBサービスページを開きます。
webservice.recruit.co.jp

画面左上の新規登録ボタンを押します。
f:id:yonayonaru:20161004000239p:plain


画面下の「上記の利用規約およびプライバシーポリシーに同意する」にチェックを入れます。
画面下のメールアドレス欄にメールアドレスを入力します。
送信ボタンを押します。
f:id:yonayonaru:20161003235913p:plain

届いたメールのURLをクリックすると登録完了ページに移動します。
f:id:yonayonaru:20161004004040p:plain

APIキー取得

再度メールが届きAPIキーが載っています。
このAPIキーがないと API実行できないので、大切に保管しておいてください。

ActiveResourceをインストールする

ActiveRecord ではなく、ActiveResource を使用するのでまずはインストールします。
Gemfileに下記内容を追記します。

Gemfile

gem 'activeresource'

下記コマンドを実行してインストールします。

bundle install

モデルを作成する

モデル作成コマンド

以下のコマンドを実行してモデルを作成します。

rails g model hotpepper

migrationファイル削除

モデルを作成するとmigrationファイルが作成されます。
いらないので作成されたmigrationファイルは削除してください。
削除するか、migration実行しないとプログラム起動時にエラーが出ます。

↓このファイルを削除(数字のところは作成日時です)
db/migrate/20161004141935_create_hotpeppers.rb

コーディング

モデルを以下のように変更します。
変更前

app/models/hotpepper.rb

class Hotpepper < ActiveRecord::Base
end

変更後(赤字部分忘れやすいので気をつけて)

app/models/hotpepper.rb

class Hotpepper < ActiveResource::Base
  self.site = "http://webservice.recruit.co.jp/"
  self.format = :json
  APIKEY = "xxxxxxxxxx" # ホットペッパー登録時のメールに記載されたAPIキーを入力してください

  def self.find_by_keyword(keyword)
    self.find(:one, from: '/hotpepper/gourmet/v1/',
      params: {key: APIKEY, format: 'json', keyword: keyword})
  end
end

プログラム内の説明
行数 名前 説明
2 self.site サイトURL
3 self.format jsonにする。デフォルトはxml
4 APIKEY ホットペッパーAPIキー
5 self.find :oneはよくわからない。調べて追記します。
fromにはself.siteに続くURL
6 params ホットペッパーAPIリファレンスのパラメータ。
KEYは必須。
(例)緯度・経度で検索したい場合
params: {key: APIKEY, format: 'json', lat: lat, lng: lng}

コントローラー作成

コントローラー作成コマンド

以下のコマンドを実行してコントローラーとviewを作成します。

rails g controller hotpeppers index

コーディング

コントローラーを以下のように記述してください。

app/controllers/hotpeppers_controller.rb

class HotpeppersController < ApplicationController
  def index
    h = Hotpepper.find_by_keyword('新宿')
    @count = h.attributes['results_available']
    @shops = h.attributes['shop']
  end
end

ビュー作成

controller作成と同時にindex.html.erb が作成されています。

コーディング

件数を表示し、お店のアイコン、店名(ホットペッパーへのリンク)、住所、営業時間を表示させます。
ホットペッパーAPIを利用するときはクレジット表記が必要なので、最後に追加しています。
htmlテンプレートがerbの場合(普通はこっち)

app/views/hotpeppers/index.html.erb

<%= @count %>
<table class="table table-striped">
  <% @shops.each do |shop| %>
    <tbody>
      <tr>
        <td rowspan="3">
          <%= image_tag(shop.logo_image) %>
        </td>
        <td>
          <%= link_to(shop.name, shop.urls.pc) %>
        </td>
      </tr>
      <tr>
        <td>
          <%= label_tag(shop.address) %>
      </tr>
      <tr>
        <td>
          <%= label_tag(shop.open) %>
        </td>
      </tr>
    </tbody>
  <% end %>
</table>
Powered by
<a href="http://webservice.recruit.co.jp/">ホットペッパー Webサービス</a>

htmlテンプレートがslimの場合

app/views/hotpeppers/index.html.slim

= @count
table.table.table-striped
  - @shops.each do |shop|
    tbody
      tr
        td rowspan="3"
          = image_tag(shop.logo_image)
        td
          = link_to(shop.name, shop.urls.pc)
      tr
        td
          = label_tag(shop.address)
      tr
        td
          = label_tag(shop.open)
| Powered by
a href="http://webservice.recruit.co.jp/"
  | ホットペッパー Webサービス

その他

ルーティング

ルートを作成したページにしておきましょう。
に以下を追記します。

config/routes.rb

root 'hotpeppers#index'

完成

起動して確認してみてください。
起動は画面上部真ん中の【Run Project】を押します。

完成イメージ

f:id:yonayonaru:20161004233439p:plain

サンプルソース

今回作成したソースは公開します。
下記リンクからどうぞ。APIキーは xxx... にしているので正しいキーを入力しないとデータ取得できません。
サンプル
サンプル slim