Railsたった14行でアドサーバーAPIができた話

     - プログラム言語 ,  


こんにちは。駆け出しエンジニアの近江です。

最近Railsにハマっているので、私が2年間担当しているアドサーバの、簡易版をRailsで作ってみました。
広告やキャンペーンを登録する管理画面はある前提で、ここからたった14行追加するだけでアドサーバーのHTTP APIを作りたいと思います。ついでに配信期間の制御も入れたいと思います。
 

テーブル構成

まずホーム画面イメージです。
oomi_capture1

キャンペーン、広告、サイト、エリア、サイズ、広告主の6つのテーブルがあります。 広告のアップロードは※CarrierWaveを使ってユーザーがローカルから画像アップロードしたら指定したディレクトリに保存されるようにしてます。

※CarrierWave…ファイルアップロード用のgemで、画像アップロードした時の保存先や表示する際の参照先などが簡単に実装できます。

 

キャンペーン作成

キャンペーン作成画面です。
oomi_capture2
キャンペーン作成前に広告、サイト、エリア、サイズ、広告主を先に登録しておきます。 登録したデータはこのキャンペーン作成画面でプルダウンから選べるようになってます。 配信期間は開始、終了日時をプルダウンから選択します。 後ほど説明するAPIのところで、配信期間内でなければ画像を表示しないようにするためです。

 

API作成

ユーザーがURLで枠情報を指定してAPIとして叩けるように、API用のルーティング設定を行います。

まずはAPI用のコントローラーの作成
rails g controller Apis

次にルーティング設定
vi config/routes.rb(一番下の2行を追加!)

[ruby]
Rails.application.routes.draw do

root ‘top#index’

resources :advertisers
resources :sites
resources :areas
resources :sizes
resources :creatives
resources :campaigns

resources :apis
get ‘/api/SITE=:site/AREA=:area/SIZE=:size’ => ‘apis#index’
[/ruby]

 

ルーティング設定に追加された事を確認(一番下がAPIに使うURLの定義です。)
rake routes

[ruby]
apis GET /apis(.:format) apis#index
POST /apis(.:format) apis#create
new_api GET /apis/new(.:format) apis#new
edit_api GET /apis/:id/edit(.:format) apis#edit
api GET /apis/:id(.:format) apis#show
PATCH /apis/:id(.:format) apis#update
PUT /apis/:id(.:format) apis#update
DELETE /apis/:id(.:format) apis#destroy
GET /api/SITE=:site/AREA=:area/SIZE=:size(.:format) apis#index
[/ruby]

 

コントローラーの設定
vi app/controllers/apis_controller.rb(9行追加!)

[ruby]
class ApisController < ApplicationController
def index
@campaign = Campaign.find_by(site: params[:site], area: params[:area], size: params[:size])
@creative = Creative.find_by(name: @campaign.creative)
if @campaign.startdate > DateTime.now || @campaign.enddate < DateTime.now
@creative = nil
end
end
end
[/ruby]

このコントローラーの設定で、URLからパラメータを受け取り、データベースからキャンペーンを特定し、
該当するキャンペーンの広告名に紐づくデータをクリエイティブテーブルから取得します。
そしてここで配信期間を確認します。 現在時刻が該当したキャンペーンの配信期間内でなければ、取得したクリエイティブテーブルの中身をnilにしています。

 

表示部分
vi app/views/apis/index.html.erb(3行追加!)

[ruby]
<% if @creative %>
<%= image_tag @creative.file.url %>
<% end %>
[/ruby]

コントローラーから受け取ったクリエイティブデータを確認し、trueであれば画像を表示する。nilになってたら表示しない。

 

実際にAPIを叩いて画像が返ってきた時のブラウザイメージ
oomi_capture3

はい、ソースに2+9+3=14行追加するだけでHTTP APIを作ることができました。

まだ配信期間の判定しかできてないですが、更に広告をローテーションしつつimpを考慮してキャンペーンの選択ができるようになると、だいぶアドサーバらしくなるので、どんどん機能拡張していきたいと思います。
弊社のアドサーバーラインナップに並ぶ日も近い!?

 


DACエンジニア採用情報

  関連記事

ECMAScript6を使ってみた ~「Promise」編

ECMAScript6とは 一応ちょっとだけ説明しておくと、 ECMAScript(エクマスクリプト)は、Ecma Internationalによって標準化されたスクリプト言語で、バージョン6が2015 年 6 月 17 日に標準仕様として発行されました。(以下、ES6と呼びます) ES6ではcon …

ナイーブベイズで羽生さんと羽生くんを分類してみた

はじめに こんにちは。システム開発部の中村です。 機械学習についての理解を促進するため、 データから分類モデルを自動で構築する古典的な方法である、 ナイーブベイズ分類器を実装してみました。 最近はCloudVisionAPIなど専ら画像解析が流行っていますが、 自分のような初学者には敷居が高そうだっ …

no image
【未経験からのRuby on Rails – 第1回】楽しく書けるプログラミング言語 “Ruby” とは

こんにちは、はじめまして。新卒1年目のmatsuari(女子)です。 この度、Rubyの勉強を始めることになりまして、 まずはたくさんあるプログラミング言語の中で、なぜ自分がRubyを学ぶのか? しっかりと把握した上で学習に取り組んでいきたいと考え、『Rubyとは何か?』調べました。 超基礎的なこと …

Android 非同期処理についてまとめてみた

Androidには、UIに影響を与えないよういくつか非同期処理が用意されています。 今回は非同期処理の代表的な ・Service ・IntentService ・HandlerThread について違いを踏まえながらまとめます! 非同期処理について(http://codezine.jp/articl …

Selenium × PHP でテスト自動化!【環境構築編】

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発を担当しています。 テスト自動化の背景 わたくしが担当するXmediaOneでは品質担保のために①コードベ …

Bootstrapのモーダル機能で多重表示する際に解決しなければならない2つの問題

はじめに みなさんこんにちは、プロダクト開発本部の亀梨です。 普段はXmediaOneというメディアプランニング・広告運用管理・トラッキング・マーケティング分析を行う 統合プラットフォームの開発・保守を担当しています。 エンジニアの皆さん、デザインってどうしてます? わたくしはプライベートでとあるW …

【未経験からのRuby on Rails – 第3回】変数と定数

こんにちは。新卒1年目のmatsuariです。 今回はRubyに限らずプログラミングを学ぶ上で非常に重要となる「変数と定数」について、ご紹介していきます。 変数とは・・・ オブジェクトを一時的に格納しておく箱で、オブジェクトを識別するために利用します。 言葉だけでは理解が難しいかと思いますので、まず …

読み方がわからない技術用語 2015

英語圏での読み方を基本的には参考にしています。英語圏でも複数の読み方をしているケースもあるようなので、あくまでも参考程度。2015と書きながら、古い言葉も混じってますが。 async – えーしんく Alt – おると ASUS – えいすーす bower &#8 …

no image
Polymer on Rails

Web Componentsをご存知だろうか。これが普及すればWebの開発は画期的に変わるだろう。 説明すると長くなるので、LIGさんのにその辺はお任せして。(この記事読んでください。) 簡単に言えば、下記にあるような新たに提案されたブラウザ向けAPIの総称。 Custom Elements, 説明 …

ディープラーニングで「顔が似ているAKB48のメンバーを教えてくれるbot」を構築

概要 こんにちは、システム開発部の中村です。 今回は、Facebook Messenger APIを利用して、 画像をアップロードすると、似ているAKB48のメンバーを教えてくれるbotを実装しました。 尚、ディープラーニングやTensorFlowそのものの解説というより、 「エンジンとしてディープ …