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が必要ですので、これを以下のように追記します。
# 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にはマイグレーションという仕組みがあり、データベースのテーブル構造を作成することができるのですが、シェルが実行できないためマイグレーションスクリプトは通常の方法では実行できません。
前回の記事では、コントローラ内でマイグレーションスクリプトと同様の処理を実行するクラスを定義しました。
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)で実行できないためです。
これをコントローラクラスから実行してテーブルを生成しています。
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件の発言の内容を表示する画面
アプリケーションのデータモデルは以下の通りです。
それぞれのテーブルの内容は以下の通りです。
・membersテーブル:
このサイトの利用者のログインID/ユーザー名/パスワードを格納
・statusesテーブル:
発言内容を格納
テーブル作成については、第3回と同様にマイグレーション用のクラス(CreateTablesクラス)を含めたコントローラ(MigrationControllerクラス)を作成し、ブラウザからコントローラにリクエストを送ることでテーブル構造とmemberテーブルのデータを作成します。
これらテーブルに対応するRailsのモデルクラスには、上記に示したデータモデルの定義に合わせてリレーションを定義してあります。
class Member < ActiveRecord::Base has_many :statuses end
class Status < ActiveRecord::Base belongs_to :member end
アプリケーションのメインとなる機能(発言の一覧表示、登録、更新、削除)は、Statusモデルに対するScaffoldで作成したものをベースとしていますので、Railsを少しご存じの方であれば、特に難解な部分はないと思います。ActiveRecordを利用したデータベースへのアクセスのコードは、以下のようにごくごく普通のRailsのコードであることが分かると思います。
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
2/3 |
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環境での動作確認 マイグレーションの代替コントローラを作る 本番環境にデプロイ、しかし…… |
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の世界を体験してみよう |
|
- プログラムの実行はどのようにして行われるのか、Linuxカーネルのコードから探る (2017/7/20)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。最終回は、Linuxカーネルの中では、プログラムの起動時にはどのような処理が行われているのかを探る - エンジニアならC言語プログラムの終わりに呼び出されるexit()の中身分かってますよね? (2017/7/13)
C言語の「Hello World!」プログラムで使われる、「printf()」「main()」関数の中身を、デバッガによる解析と逆アセンブル、ソースコード読解などのさまざまな側面から探る連載。今回は、プログラムの終わりに呼び出されるexit()の中身を探る - VBAにおけるFileDialog操作の基本&ドライブの空き容量、ファイルのサイズやタイムスタンプの取得方法 (2017/7/10)
指定したドライブの空き容量、ファイルのタイムスタンプや属性を取得する方法、FileDialog/エクスプローラー操作の基本を紹介します - さらば残業! 面倒くさいエクセル業務を楽にする「Excel VBA」とは (2017/7/6)
日頃発生する“面倒くさい業務”。簡単なプログラミングで効率化できる可能性がある。本稿では、業務で使うことが多い「Microsoft Excel」で使えるVBAを紹介する。※ショートカットキー、アクセスキーの解説あり
|
|