GAE+PHP/Rubyで拓く新世界

第5回 GAE+SQL4GでRailsアプリを開発してみよう

萩原 巧
リトルソフト株式会社

中越 智哉
株式会社ナレッジエックス

2010/4/12

google-appengine gemについて

 しかしながら、JRubyさえインストールすればすぐにGAE上にRailsアプリケーションをデプロイできるわけではありません。JRuby on RailsのアプリをGAEのアプリケーションサーバ上で稼働できるようにデプロイ用のセッティングをしなければなりません。これは、JavaのWebアプリケーションでデプロイ用にWARファイルを生成する作業に相当します。

 そのために使われるのが、google-appengineというgem、およびこれと一緒にインストールされる一連のgemです。google-appengine gemとともにインストールされるgemは以下のとおりです。

・appengine-rack
・appengine-sdk
・appengine-jruby-jars
・bundler
・rubyzip

 google-appengineについての詳しい情報は、プロジェクトのホームページをご覧ください。

関連リンク:
リンク appengine-jruby(Google Code)
http://code.google.com/p/appengine-jruby/

セットアップスクリプト(rails2_appengine.rb)について

 google-appengine gemのインストールに加えて、セットアップスクリプト(rails2_appengine.rb)を実行することで、通常のRailsアプリをGAE対応の構成に変更することができます。

 スクリプトを実行すると、GAE上でRailsを実行するために必要なgemや実行環境をダウンロード、インストールしたのちに、railsコマンドの実行と同様のディレクトリ構造作成を行います。実はこのセットアップスクリプトは空のディレクトリにGAEに対応したディレクトリ構造を作ります。このため元々アプリケーションが入っているディレクトリ上でセットアップスクリプトを実行すると、いくつかのファイルを上書きすることになり、途中で上書きしても良いかを聞かれることになります。

 さらにセットアップスクリプトは、Gemfileとconfig.ruというファイルをダウンロードします。Gemfileにはデプロイ時にバンドルしたいgemを指定することができます。SQL4Gを使うためにはGemfileに上記にあるactiverecord-jdbch2-adapterが必要ですので、これを以下のように追記します。

●Gemfile
# Critical default settings:
disable_system_gems
disable_rubygems
bundle_path '.gems/bundler_gems'

# List gems to bundle here:
gem 'rails_dm_datastore'
gem 'rails', "2.3.5"
gem 'activerecord-jdbc-adapter' # この行を追加します

Rails+SQL4Gでのマイグレーション

 ActiveRecordを利用するRailsアプリをGAEで動かすために問題となるのが、GAEにはシェルが提供されないことです。Railsにはマイグレーションという仕組みがあり、データベースのテーブル構造を作成することができるのですが、シェルが実行できないためマイグレーションスクリプトは通常の方法では実行できません。

 前回の記事では、コントローラ内でマイグレーションスクリプトと同様の処理を実行するクラスを定義しました。

●sample_controller.rb内に定義したCreateEmployeeクラス
class CreateEmployees < ActiveRecord::Migration
  def self.up
      execute <<-"EOF"
create table employees (
  id integer not null default 0 auto_increment primary key,
  no integer,
  name varchar(255),
  dept varchar(255),
  created_at timestamp,
  updated_at timestamp
)
      EOF
  end
end


  しかしながら、通常のマイグレーションスクリプトのように、create_tableメソッドは利用していません。これは、create_tableメソッドが内部で生成するSQLの一部がSQL4G(H2 Database)で実行できないためです。

 これをコントローラクラスから実行してテーブルを生成しています。

●SampleControllerクラスのupメソッド
  def up
    CreateEmployees.up
    Employee.create(:no=>1,:name=>"ながお",:dept=>"開発部")
    Employee.create(:no=>2,:name=>"はぎわら",:dept=>"技術部")
    Employee.create(:no=>3,:name=>"なかごし",:dept=>"教育部")
    redirect_to :action=>:index
  end

 テーブルを生成してしまえば、後は通常のRailsアプリケーションのActiveRecordの扱いと変わりません。

Rails+SQL4Gでアプリケーションを開発してみる

 では、今回は実際にもう少しアプリケーションらしいものを作成し、GAE上で動作させてみましょう。題材はTwitter風のマイクロブログアプリケーションです。

 このアプリケーションのソースコードはこちら(microblog.zip)からダウンロードできますので、お手元でソースコードをご覧頂きながら以下の解説を読んで頂くとより理解しやすいと思います。正直なところ、アプリケーションのソースコード自体はSQL4Gの性格上、普通のRailsアプリとなんら変わるところがありませんので、アプリケーションそのものの説明よりもデプロイするまでの手順を詳しく見ていただきたいと思います。

 画面のイメージは以下の通りです。

画面遷移図

 それぞれの画面の役割は以下の通りです。Twitterをご存じの方であれば、なんとなく想像がつくのではないかと思います。

ログイン画面(app/views/login/index.html.erb):
ログインID/パスワードを入力してログインする

一覧画面(app/views/statuses/index.html.erb):
過去の発言内容の一覧表示と、新規の発言を入力する画面

更新画面(app/views/statuses/edit.html.erb):
自分の発言内容を更新する画面

詳細画面(app/views/statuses/show.html.erb):
1件の発言の内容を表示する画面

 アプリケーションのデータモデルは以下の通りです。

ER図

 それぞれのテーブルの内容は以下の通りです。

membersテーブル:
このサイトの利用者のログインID/ユーザー名/パスワードを格納
statusesテーブル:
発言内容を格納

 テーブル作成については、第3回と同様にマイグレーション用のクラス(CreateTablesクラス)を含めたコントローラ(MigrationControllerクラス)を作成し、ブラウザからコントローラにリクエストを送ることでテーブル構造とmemberテーブルのデータを作成します。

 これらテーブルに対応するRailsのモデルクラスには、上記に示したデータモデルの定義に合わせてリレーションを定義してあります。

●Memberクラス
class Member < ActiveRecord::Base
  has_many :statuses
end
●Statusクラス
class Status < ActiveRecord::Base
  belongs_to :member
end

 アプリケーションのメインとなる機能(発言の一覧表示、登録、更新、削除)は、Statusモデルに対するScaffoldで作成したものをベースとしていますので、Railsを少しご存じの方であれば、特に難解な部分はないと思います。ActiveRecordを利用したデータベースへのアクセスのコードは、以下のようにごくごく普通のRailsのコードであることが分かると思います。

●StatusesControllerクラス(抜粋、コメントおよびビューを呼び出す処理は割愛しています)
class StatusesController < ApplicationController
  def index
    @statuses = Status.all(:order=>"created_at desc")
    @status = Status.new

    ・・・
    end
  end

  def show
    @status = Status.find(params[:id])

    ・・・
  end

  def edit
    @status = Status.find(params[:id])
  end

  def create
    @status = Status.new(params[:status])
    @status.member = session[:member]

    respond_to do |format|
      if @status.save
        ・・・
      else
        ・・・
      end
    end
  end

  def update
    @status = Status.find(params[:id])

    respond_to do |format|
      if @status.update_attributes(params[:status])
        ・・・
      else
        ・・・
      end
    end
  end

  def destroy
    @status = Status.find(params[:id])
    @status.destroy

    ・・・
  end
end

prev
2/3
next

Index
GAE+SQL4GでRailsアプリを開発してみよう
  Page1
JRubyについて
ActiveRecordとSQL4Gの連携
  Page2
google-appengine gemについて
セットアップスクリプト(rails2_appengine.rb)について
Rails+SQL4Gでのマイグレーション
Rails+SQL4Gでアプリケーションを開発してみる
  Page3
JRuby on Rails環境(非GAE)での動作確認
GAE環境での動作確認
マイグレーションの代替コントローラを作る
本番環境にデプロイ、しかし……

index GAE+PHP/Rubyで拓く新世界

 Coding Edgeお勧め記事
いまさらアルゴリズムを学ぶ意味
コーディングに役立つ! アルゴリズムの基本(1)
 コンピュータに「3の倍数と3の付く数字」を判断させるにはどうしたらいいか。発想力を鍛えよう
Zope 3の魅力に迫る
Zope 3とは何ぞや?(1)
 Pythonで書かれたWebアプリケーションフレームワーク「Zope 3」。ほかのソフトウェアとは一体何が違っているのか?
貧弱環境プログラミングのススメ
柴田 淳のコーディング天国
 高性能なIT機器に囲まれた環境でコンピュータの動作原理に触れることは可能だろうか。貧弱なPC上にビットマップの直線をどうやって引く?
Haskellプログラミングの楽しみ方
のんびりHaskell(1)
 関数型言語に分類されるHaskell。C言語などの手続き型言語とまったく異なるプログラミングの世界に踏み出してみよう
ちょっと変わったLisp入門
Gaucheでメタプログラミング(1)
 Lispの一種であるScheme。いくつかある処理系の中でも気軽にスクリプトを書けるGaucheでLispの世界を体験してみよう
  Coding Edgeフォーラムフィード  2.01.00.91


Coding Edge フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

>

Coding Edge 記事ランキング

本日 月間