GCM登録用サーバの製作
前回製作したGCM (Google Cloud Messaing) のサンプルでは、スタンドアロンで動くRubyスクリプトからメッセージを送信していました。本来期待されるべき作りとしては、以下のような機能を持つサーバアプリケーションが必要になります。
- GCMサーバからAndroidアプリに発行されたRegistration IDを受け取り、保存する処理
- 保存したRegistration IDを使ってGCMサーバにメッセージを投入する処理
今回は前者の方をRailsを使って製作しました (前半の登録部分のみ)。
特に変わったことはしていないと思いますが、Railsあまり慣れていないので手間取りました…
前提としたバージョンは以下の通りです。
- Ubuntu Linux 12.04 (64ビット版)
- Ruby 1.9.3p194
- Rails 3.2.8
モデル
先ほどのリクエストに登場するdevice_idとregistration_idのほかに、コメントを記述するためのdescriptionを設けています。
gcm_app_server/app/model/device.rb:
class Device < ActiveRecord::Base attr_accessible :description, :device_id, :registration_id end
コントローラ
HTTP POSTのリクエストボディとして受け取ったdevice_id, registration_idからDeviceオブジェクトを作成し、DBに保存します。
ここでのややはまりは、
- Railsのnewアクションから遷移した場合と直接HTTP POSTを投げた場合でparamsのキーが変わる (前者では、"device_" のようなprefixがつく)
- render :json => オブジェクト とすることで、HTTPレスポンスをJSON形式で返せる
gcm_app_server/app/controller/DevicesController:
class DevicesController < ApplicationController # 登録済みRegistration IDの一覧 def index @devices = Device.all end # Registration IDの登録 def register reg_id = params[:registration_id] dev_id = params[:device_id] @device = Device.create(:device_id => dev_id, :registration_id => reg_id, :description => "") render :json => @device end end
ビュー
メインの登録用アクション (register) はビューを持ちませんが、一応一覧表示用アクション (index) のビューを貼っておきます。
gcm_app_server/app/views/devices/index.html.erb:
<h1>デバイス一覧</h1> <table class="devices"> <tr> <td>#</td> <td>Device ID</td> <td>Registration ID</td> <td>Description</td> </tr> <% @devices.each do |device| %> <tr> <td><%= device.id %></td> <td><%= device.device_id %></td> <td><%= device.registration_id %></td> <td><%= device.description %></td> </tr> <% end %> </table>
試行錯誤の後がいろいろ含まれていますが、一応indexのスクリーンショット。