SVNリポジトリを使ってRailsアプリケーションを安全に開発 at RailsPlayground.com
注意: 書かないと確実に忘れてミスりそうなのでメモ。当方SVN初心者。もっと手順の少ない楽な方法があれば是非教えてください。
やりたいこと
ローカルのRailsアプリケーションの変更をリモートサーバー上のRailsアプリケーションに「安全に」反映させたい。
Railsの性質上、ローカル - リモートサーバー間の直接の書き換えは超絶危険なので、中継地点としてSVNリポジトリを利用する。これにより、ローカルの変更はSVNリポジトリへ別(サブ)バージョンとして保管、実際のリモートサーバー上での運営はSVNリポジトリから適切なバージョンを拾ってくることで反映させる。つまり手元で変ちくりんな修正を行ってしまっても古いバージョンが保管されているのでリセット可能。かなり大胆なweb運営ができる。
簡単な環境説明
RailsPlayground.comは名前の通り、Ruby on Railsアプリケーションが簡単に使えるのが売りの海外のレンタルサーバー。例えばさくらインターネットだとRailsは手動でインストールできるけど、FastCGIが使えないので動作が遅いらしい(例えばがんちゃんのブログ: さくらのレンタルサーバでRuby on Railsをうごかしてみた…らかなり遅いかも…)。日本国内だとRailsが標準装備のレンタルサーバーは値段がはってしまうようなので、月額$5のRailsPlaygroundを借りてみた。海外だと他にもBluehostやTextdrive(現Joyent?)等が有名みたいだけど少し高い。
RailsPlayGroundの$5プランは破格なんだけど使用できるサーバーがApacheオンリーのようなので、Lighttpd等を複数使いたい場合は上のプランを選ばないといけない。あとRailsPlayGroundは契約フォームまわりがすっごくうさんくさかった。User IDが6文字までとか、いきなりクレジットカード番号いれさせられたり、なんか諸々。性能やら手続きやらについてはRailsPlaygroundの申し込み方法 (Ruby on Rails)あたりがわかりやすいかも。サブドメイン、データベースが作成し放題なので、例えばxreaみたいにスパムサイトの温床になりそうなので少し気がかりだけど、今のところ快適に動作している。
SVNリポジトリ設定
- RailsPlaygroundにSVNで管理したい旨をメールで要請(要請しないと使えない)。24時間サポートらしくすぐ専用のURLが送られてくる。アクセス先(IDとPW入力)でリポジトリスペースとアカウント作成などを行う。ここではリポジトリ名をrailsappとしておく。SVNリポジトリの保管先はこんな感じになる。
http://YOURACCOUNT.svnrepository.com/svn/railsapp
YOURACCOUNT部分はサーバー管理者が適当に与えてくれる。
- RailsPlaygroundサーバースペースにRailsアプリケーション(以下railsapp)を作成(ドキュメントルートより上)。理由はrailsappを作成する際、Apacheで動作するよう.htaccessをRailsが勝手に作成してくれるから。Apacheでちゃんと動作するように.htaccessを自分で作成できるならこの手順は不要。Apacheサーバーで運営する予定のない人にも不要。
- 先ほど作成したrailsappプロジェクト全部をローカルに保存。実際に欲しいのは.htaccessファイル「のみ」なので、事前にローカルで作成したRailsアプリケーション内に.htaccessだけコピーしてもってきてもよいと思う。
- ローカルのrailsappプロジェクト全部をSVNリポジトリにインポート。ローカルのrailsappディレクトリ内より
svn import -m "MESSAGE" . http://YOURACCOUNT.svnrepository.com/svn/railsapp
MESSAGE部分はお好みで(”First import”など)。
- インポートが完了したら手元にSVNリポジトリからのコピーを持ってこないといけない(リポジトリとシンクロさせるため)。とりあえずローカルのrailsappを別ディレクトリに移すなどする(ここではrailsappディレクトリと同じ階層にrails_backとして保存)。
mv /path/to/railsapp /path/to/railsapp_back
- あらためてリポジトリよりチェックアウト。コピーしたい場所より
svn co http://YOURACCOUNT.svnrepository.com/svn/railsapp
これでSVNリポジトリrailsappとローカルrailsappがシンクロする。ローカルrailsappを変更してSVNリポジトリへコミット(ci)すると別バージョンとして保存されるはず。
- 次にSVNリポジトリのrailsappをRailsPlaygroundのリモートサーバー上へコピーする。これも基本はローカル - SVNリポジトリの場合と同じように、SVNリポジトリ - リモートサーバー間でシンクロさせてやる必要がある。RailsPlaygroundの自分のドメインへアクセス、sshで
ssh YOURID@YOURDOMAIN.COM
YOURIDとYOURDOMAIN.COMはRailsPlaygroundの契約IDと設定ドメイン。
- ドキュメントルートより上にSVNリポジトリをチェックアウト。手順2ですでにrailsappを作成している場合は全部削除。かわりにSVNリポジトリより呼び出す。
svn co http://YOURACCOUNT.svnrepository.com/svn/railsapp
これでリモートサーバーとSVNリポジトリがシンクロする。必要なときに必要なバージョンをSVNリポジトリから拾ってくればよい。バージョンの選び方等はSubversionの使い方を参照ください。
- RailsPlaygroundサーバー上railsapp/publicのシンボリックリンクをドキュメントルート配下に設置。例えば
ln -s ~/railsapp/public ~/public_html/railsapp
これでhttp://YOURDOMAIN.COM/railsappにアクセスするとSVNリポジトリの内容を反映したRailsアプリケーションが表示されるはず。Railsアプリケーションをドキュメントルート以下に配置すると色々不都合があるためこのような回りくどい処理を行う。
基本の作業手順
ローカル - SVNリポジトリ、SVNリポジトリ - リモートサーバーがシンクロしていることが前提。
svn co http://YOURACCOUNT.svnrepository.com/svn/railsapp
svn ci -m "MESSAGE" http://YOURACCOUNT.svnrepository.com/svn/railsapp
ssh YOURID@YOURDOMAIN.COM
svn co http://YOURACCOUNT.svnrepository.com/svn/railsapp
Apache + Rails + Flex: FlashVarsを使う場合
データベースに格納された本のスコアデータをxmlに整形してFlexチャートに読み込ませたい。実際のデモはBook reviewを参照ください。デモの場合、各ページごとにFlexに読み込ませたいデータが異なるのでFlashVarsを用いてswfファイル外部からコントロールしてやる。

Rails側
スコアデータ5種類用意。特定のbook idのスコアデータをFlexで読み込みやすいようにxmlデータで出力させる。Flex側で極力整形を避けたかったので、Rails側で以下のようなxmlデータを作るURL(例えば、:controller => ‘book’, :action => ‘create_xml’, :id => @book.id)を作成しておく。具体例はFlex + Ruby on Rails + MySQL 連携メモを参照ください。
<?xml version="1.0" encoding="UTF-8"?> <grades> <grade> <label>Easy to read?</label> <score>9</score> </grade> <grade> <label>Good contents?</label> <score>8</score> </grade> <grade> <label>Latest version?</label> <score>7</score> </grade> <grade> <label>Reasonable price?</label> <score>10</score> </grade> <grade> <label>Recommend to people?</label> <score>6</score> </grade> </grades>
各本詳細ページ上にswfファイルを埋め込み、その本のスコアデータXMLを出力するURLをFlashVarsで指定してやる(最後の一行部分)。
AC_FL_RunContent(
"src", "path/to/swf_file",
"width", "300",
"height", "220",
"align", "middle",
"id", "swf_id",
"quality", "high",
"bgcolor", "#ffffff",
"name", "swf_name",
"allowScriptAccess","sameDomain",
"type", "application/x-shockwave-flash",
"pluginspage", "http://www.adobe.com/go/getflashplayer",
"FlashVars", "url=path/to/<%= @book.id %>"
);
FlashVarsに送るURL部分を
"Flashvars", "url=<%= url for :controller => ‘book’, :action => ‘create_xml’, :id => @book.id %>"
のように書いてもよいが、Apacheの場合、url_forの出力がRailsアプリケーションディレクトリ(railsapp)からのパスになるので注意が必要。例えば@book.id=5だと
//Apacheの場合 /railsapp/book/create_xml/5 //Lighttpdの場合 /book/create_xml/5
となる。この辺の話は [Rails] Rails の動作環境と Location について - プログラミングは素晴らしいが詳しい。
Flex側
FlashVarsで送信された変数を受け取る。Flash(ActionScriptクラス)の場合と異なるので注意必要。
//Flex Applicationの場合 var params:Object = Application.application.parameters; trace(params.url);//"path/to/xml_data" //Flashの場合 var params:Object = this.loaderInfo.parameters; trace(params.url);//"path/to/xml_data"
Flex内部のArrayCollectionに格納するまでの流れは以下の通り(抜粋)。完全なソースはこちらを参照ください。
import mx.rpc.http.HTTPService; import mx.rpc.events.ResultEvent; import mx.collections.ArrayCollection; var params:Object = Application.application.parameters; var req:HTTPService = new HTTPService(); req.url = params.url; req.send(); req.addEventListener(ResultEvent.RESULT, onResult); function onResult(e:ResultEvent):void{ var ac:ArrayCollection = e.result.grades.grade; //データ処理に続く }
追記: 2008/08/08
チャート部分をFlexからActionScriptのみで作成したところ、ファイルサイズが236kb -> 4kbになった。
[Rails]Book reviews
ブログでレビューを書いてもいいのだけど、せっかくだからRailsを使ってレビューサイトを作成した。レビュー書いたりかかなかったりだけど、レーダーチャート(?)で何となく予想してみてください。可能ならFlashなりなんなりの有志にアカウント与えて技術書の各々のレビューを残したりできるとよいかもしれない。
Flex + Ruby on Rails + MySQL 連携メモ
Tags: Flex, MySQL, Rails, Ruby
データベースの情報をRailsでXMLファイルに整形しFlexに読み込ませる。Model-View-Controller(MVC)パターンで言うとMCをRailsに、VをFlexに担当させる。今までデータベースへのアクセスはPHPスクリプトを書いて行っていたが、Railsを用いるとその面倒くさいテンプレート書きが必要なくなるので非常に快適。用いたのはFlexSDK 3.0, Ruby 1.8.6, Rails 1.2.6, MySQL 5.0.5。Railsは最新の2.xを用いても特に問題ないと思う。以下の例ではデータベースに格納されたの本の詳細(title, price, description)をRailsで管理、FlexのGridDataに読み込ませている。
Rails側
Railsで適当なプロジェクト(ここではflex_connect)を作成。コマンドラインより
rails flex_connect
データベースを作成。MySQLコマンドラインより
mysql> create database flex_connect_development;
Railsプロジェクト内config/database.ymlを設定(今回はdevelopmentのみ使用)。
development: adapter: mysql database: flex_connect_development username: root password: [YOURPASSWORD] socket: /tmp/mysql.sock
次にモデルを作成(ここではBook)。Railsプロジェクト内に移動してコマンドラインより
ruby script/generate model Book
Railsプロジェクト内、db/migrate/xxx_create_books.rb(xxxの部分はrailsのバージョンによって異なる)を以下のように修正。
class CreateBooks < ActiveRecord::Migration def self.up create_table :books do |t| t.column :title, :string t.column :price, :float t.column :description, :text end end def self.down drop_table :books end end
コマンドラインより
rake migrate
これによりDB: flex_connect_developmentにテーブルbooks(title, price, description)が作成される(MySQLを直接触らなくてよい!)。テーブル内に適当にテストデータを入力しておく(title=”Flex3″, price=”54.99″, description=”Adobe developer library”, etc.)。Railsから入力してやるのが簡単だがここでは割愛。
次にコントローラーを作成。コマンドラインより
ruby script/generate controller Book
Railsプロジェクト内、app/controllers/book_controller.rbに以下のメソッドを定義。
class BookController < ApplicationController def make_xml @books = Book.find(:all) render :xml => @books.to_xml end end
これで”http://localhost:3000/book/make_xml”にアクセスするとデータベース情報がXML形式で出力される。例えばこんな感じ。
<?xml version="1.0" encoding="UTF-8"?> <books> <book> <description>Ruby on Rails made easy.</description> <id type="integer">3</id> <price type="float">34.99</price> <title>Rails Solutions</title> </book> <book> <description>The Adobe developer library guide for rich interner application developers</description> <id type="integer">4</id> <price type="float">44.99</price> <title>Flex 3 Cookbook</title> </book> <book> <description>Friends of ED Adobe lerning library.</description> <id type="integer">5</id> <price type="float">54.99</price> <title>The Essential Guide To Flex 3</title> </book> </books>
Flex側
“http://localhost:3000/book/make_xml”の内容をDataGridに表示させるソースは以下の通り。上記RailsのXMLファイルを出力するURLをロードしてDataGridに格納している。詳細は割愛。
<?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init(event)"> <mx:DataGrid dataProvider="{_bookList}"> <mx:columns> <mx:DataGridColumn dataField="title" /> <mx:DataGridColumn dataField="price" /> <mx:DataGridColumn dataField="description" /> </mx:columns> </mx:DataGrid> <mx:Script> <![CDATA[ import mx.collections.ArrayCollection; import mx.rpc.http.HTTPService; import mx.rpc.events.ResultEvent; import mx.rpc.events.FaultEvent; import mx.controls.Alert; import flash.net.URLRequestMethod; [Bindable] private var _bookList:ArrayCollection private function init(e:Event):void{ var req:HTTPService = new HTTPService(); req.url = "http://localhost:3000/book/make_xml"; req.method = URLRequestMethod.POST; req.send(); req.addEventListener(ResultEvent.RESULT,onResult); req.addEventListener(FaultEvent.FAULT,onFault); } private function onResult(e:ResultEvent):void{ _bookList = e.result.books.book; e.target.removeEventListener(ResultEvent.RESULT,onResult); e.target.removeEventListener(FaultEvent.FAULT,onFault); } private function onFault(e:FaultEvent):void{ Alert.show("Could not connect the database.","ERROR"); e.target.removeEventListener(ResultEvent.RESULT,onResult); e.target.removeEventListener(FaultEvent.FAULT,onFault); } ]]> </mx:Script> </mx:Application>
まとめ
今回はRails側にMVCパターンのMCを担当させた。同様にしてRails側のコントローラーに適切なメソッド(データの追加・削除 etc.)を追加することで専用のURLを簡単に作成できるので、Flex側は必要なURLにアクセスするだけでよくなった。
[Books]Ruby on Rails - up and running
結論: Railsのバージョンの違いは致命的。この本は扱っているRailsのバージョンが1.1と古いので買うべからず。買うならRails 2.xと明記した最近の本を。
O’reillyでRuby on Railsを扱っている本がこれしかなかったので盲目的に買ったが失敗。扱ってるRailsのバージョンが古すぎて(1.x)、現行のRails 2.xだと四苦八苦することが多い。本自体は150ページと割と薄めで、一つのRailsアプリケーションを題材に進行していくため、(頭に入るかどうかは別として)よみすすめやすくはある。ただしRuby自体の教本ではないので(それほど親切に説明はない)Rubyのリファレンスは必要。僕は平行してThe Ruby Programming Languageを読んだ。
Railsのバージョンアップは初学者にはかなりの障壁になるようなので、もし手持ちの本がRails 1.xを扱っているようであれば、Railsのバージョンを落として学ぶか(仕組みを覚えてから2.xに移行)、2.xを扱う本を買った方が効率がよいと思う。以下Rails 1.x > 2.xの違いについて参考にしたページ。
- Rails 2.0移行でつまずくポイント
- Rails 2.0 を使うときに注意すること その 1 - プログラミングのこととか
- InfoQ: Rails 2.0 - 初心者がすべきことは?
- よしたんのぶろぐ scaffold ? paginate ? なんじゃそれ?
追記 2008/08/08
レーダーチャートによる評価レビューはこちら

