<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>func09 &#187; ruby</title>
	<atom:link href="http://www.func09.com/wordpress/archives/tag/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://www.func09.com/wordpress</link>
	<description>Just another WordPress weblog</description>
	<lastBuildDate>Mon, 06 Feb 2012 04:25:55 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>[sinatra for flasher] 大量のダミーデータを返すAPIを作る</title>
		<link>http://www.func09.com/wordpress/archives/801</link>
		<comments>http://www.func09.com/wordpress/archives/801#comments</comments>
		<pubDate>Wed, 17 Feb 2010 04:30:41 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[haml]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=801</guid>
		<description><![CDATA[FLASHer のためのSinatra入門 [導入編] 前回の続きです。 今回は大量のダミーデータを返すAPIを作ってみます。 要件としては 住所録を返すAPI 本番サーバはPHPなので、URLもそれに合わせる 100件 [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.func09.com/wordpress/archives/764">FLASHer のためのSinatra入門 [導入編]</a></p>

<p>前回の続きです。</p>

<p>今回は大量のダミーデータを返すAPIを作ってみます。<br />
要件としては</p>

<ul>
<li>住所録を返すAPI</li>
<li>本番サーバはPHPなので、URLもそれに合わせる</li>
<li>100件程度、ランダムで返す</li>
<li>XMLの内容は、名前、メール、メッセージ、性別、国</li>
</ul>

<p>という感じです。</p>

<p><span id="more-801"></span></p>

<h2>Haml</h2>

<p>今回はテンプレート言語に<a href="http://haml-lang.com/">Haml</a>を使っていきます。<br />
タグ構造をインデントと簡略構文でガシガシ書いていけるので、慣れると気持ちいいです。</p>

<p>日本Hamlの会<br />
<a href="http://haml.ursm.jp/">http://haml.ursm.jp/</a></p>

<p>Getting Started Haml<br />
<a href="http://haml.ursm.jp/getting-started">http://haml.ursm.jp/getting-started</a></p>

<p>ざっくりと説明すると</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">!!! XML<br />
<span style="color:#006600; font-weight:bold;">%</span>items<br />
&nbsp; <span style="color:#006600; font-weight:bold;">%</span>item<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;1&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> こんにちは<br />
&nbsp; <span style="color:#006600; font-weight:bold;">%</span>item<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;2&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> さようなら</div></div>

<p>というHamlマークアップが</p>

<div class="codecolorer-container xml blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="xml codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;?xml</span> <span style="color: #000066;">version</span>=<span style="color: #ff0000;">'1.0'</span> <span style="color: #000066;">encoding</span>=<span style="color: #ff0000;">'utf-8'</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;1&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>こんにちは<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
&nbsp; <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item</span> <span style="color: #000066;">id</span>=<span style="color: #ff0000;">&quot;2&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>さようなら<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span><br />
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/items<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></div></div>

<p>に変換されます。<br />
雰囲気だけ掴んでもらって、詳しくは<a href="http://haml-lang.com/tutorial.html">チュートリアル</a>や<a href="http://haml-lang.com/docs/yardoc/file.HAML_REFERENCE.html">ドキュメント</a>を御覧下さい。</p>

<h2>Forgeryでサンプルデータの作成から解放される</h2>

<p><a href="http://github.com/sevenwire/forgery">forgeryというgemライブラリ</a>で、煩瑣なサンプルデータ作成とはおさらばできる。</p>

<div class="codecolorer-container bash blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> forgery</div></div>

<p>でインストールして、使い方は</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'forgery'</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span> <span style="color:#008000; font-style:italic;">#=&gt; tmccoy@topiclounge.biz</span><br />
<span style="color:#CC0066; font-weight:bold;">puts</span> Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span> <span style="color:#008000; font-style:italic;">#=&gt; charper@voolia.net</span></div></div>

<p>こんな感じ。標準でサンプルデータの辞書がいろいろ入っていて、上記のコードはメールアドレスのサンプルデータをランダムに生成している。</p>

<p>今回はForgeryを積極的に使う。</p>

<h2>コード</h2>

<p>いきなりですが最終型のコード</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'sinatra'</span><br />
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'forgery'</span><br />
<br />
before <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; content_type <span style="color:#996600;">'xml'</span> <span style="color:#008000; font-style:italic;"># 常にContent-Typeを 'application/xml'に</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
get <span style="color:#996600;">'/api/getFriends.php'</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; haml <span style="color:#ff3333; font-weight:bold;">:get_friends_php</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span><br />
<br />
__END__<br />
<br />
@@ layout<br />
!!! XML<br />
= <span style="color:#9966CC; font-weight:bold;">yield</span><br />
<br />
@@ get_friends_php<br />
<span style="color:#006600; font-weight:bold;">%</span>friends<br />
&nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;#{i}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">last_name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:lorem_ipsum</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paragraph</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:personal</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">gender</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">country</span></div></div>

<p>今回は1ファイルで完結させてみた。</p>

<p>ブラウザで http://localhost:9393/api/getFriends.php （ポートはshotgunデフォルト）にアクセスすると、下みたいなXMLが取得できる。</p>

<p><img src="http://www.func09.com/wordpress/wp-content/uploads/16ff47c99cb3e8cd7ed0b7054cfbbdb8.jpg" alt="" title="次のソース_ http___localhost_9393_api_getFriends.php" width="550" height="464" class="alignnone size-full wp-image-805" /></p>

<h3>beforeフィルター</h3>

<p>常にXMLを返すAPIなので、リクエストを受け付けて処理する前にContent-Typeを&#8217;application/xml&#8217;にするように設定。<a href="http://www.sinatrarb.com/book.html#filters">Sinatraのbeforeフィルター</a>という機能で実現。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">before <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; content_type <span style="color:#996600;">'xml'</span> <span style="color:#008000; font-style:italic;"># 常にContent-Typeを 'application/xml'に</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>

<h3>URLに対する処理</h3>

<p>/api/getFriends.phpというパスに対して処理したい場合、Sinatraのgetメソッドに続いて、そのパスを定義する。 do ~ end ブロックの中に処理を記述。</p>

<p>この場合Hamlでget_friends_phpテンプレートを出力する処理のみだね。</p>

<p>パスに普通に「.php」とか使えているところに注目してもらいたい。要するにマッチすればなんでも良いので「.pl」でも「.cgi」でも「.do」でも本番と同じパスを表現できるはずだ。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">get <span style="color:#996600;">'/api/getFriends.php'</span> <span style="color:#9966CC; font-weight:bold;">do</span><br />
&nbsp; haml <span style="color:#ff3333; font-weight:bold;">:get_friends_php</span><br />
<span style="color:#9966CC; font-weight:bold;">end</span></div></div>

<h3>Hamlによるテンプレート</h3>

<p>Sinatraには「ファイル内テンプレート」という機能があって、テンプレートをわざわざ別ファイルとして用意しなくても、ソースファイルの最後（<strong>END</strong>以降）に テンプレートを書いても良いことになっている。</p>

<p>テンプレート名は「@@index」とか「@@layout」とか先頭に「＠＠」を付けて置くこと。</p>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">__END__<br />
<br />
@@ layout<br />
!!! XML<br />
= <span style="color:#9966CC; font-weight:bold;">yield</span><br />
<br />
@@ get_friends_php<br />
<span style="color:#006600; font-weight:bold;">%</span>friends<br />
&nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;#{i}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">last_name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:lorem_ipsum</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paragraph</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:personal</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">gender</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">country</span></div></div>

<h4>レイアウト</h4>

<p>layout という名前のテンプレートがあれば、Sinatraはすべてのテンプレートのレイアウト、つまり枠として利用する。</p>

<p>「!!! XML」はXMLのドキュタイプ宣言を簡略表現で、「= yield」は、ここにメインテンプレートの内容を流し込むよーという処理。</p>

<h4>get_friends_php テンプレート</h4>

<div class="codecolorer-container ruby blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="ruby codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">@@ get_friends_php<br />
<span style="color:#006600; font-weight:bold;">%</span>friends<br />
&nbsp; <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC0066; font-weight:bold;">rand</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">100</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">times</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>i<span style="color:#006600; font-weight:bold;">|</span><br />
&nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>friend<span style="color:#006600; font-weight:bold;">&#40;</span>id=<span style="color:#996600;">&quot;#{i}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>name<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>first_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>last_name= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">last_name</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>email= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:internet</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">email_address</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>message= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:lorem_ipsum</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">paragraph</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>gender= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:personal</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">gender</span><br />
&nbsp; &nbsp; &nbsp; <span style="color:#006600; font-weight:bold;">%</span>country= Forgery<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:address</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">country</span></div></div>

<p>XMLのタグ表現を「%タグ名」とインデント階層でマークアップしていく。<br />
「- rand(100).times do |i|」は、以降の下層インデントの部分をランダムで100件まで繰り返させている。</p>

<p>あとはForgeryの住所辞書や名前辞書を使ってサンプルデータを埋め込むよ。</p>

<h2>さいごに</h2>

<p>今回はFlashで使えそうな大量のダミーデータAPIをさくっと作ってみたよ。慣れれば10分もあれば作れるので、下手に実データを作るより楽なはず。</p>

<p>今後は</p>

<ul>
<li>HTTP POSTでデータを送信するような場合</li>
<li>JSONの場合</li>
</ul>

<p>など書いてみようかと。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/801/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Sinatra] Sinatraでnamespaceルート（嘘）</title>
		<link>http://www.func09.com/wordpress/archives/799</link>
		<comments>http://www.func09.com/wordpress/archives/799#comments</comments>
		<pubDate>Tue, 16 Feb 2010 14:57:23 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=799</guid>
		<description><![CDATA[Sinatra 楽しい！ 今のところあまり大きなものを作る予定がないんだけど、ひとつのファイルにたくさんのルートを書いているとごちゃごちゃしてちょっと嫌だ。 かといってコントローラーを複数に別けるのもSinatraスタイ [...]]]></description>
			<content:encoded><![CDATA[<p>Sinatra 楽しい！</p>

<p>今のところあまり大きなものを作る予定がないんだけど、ひとつのファイルにたくさんのルートを書いているとごちゃごちゃしてちょっと嫌だ。</p>

<p>かといってコントローラーを複数に別けるのもSinatraスタイルに反しているような気がする。そこでルートの階層をわかりやすくするTIPS。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">def namespace routename, &amp;block<br />
&nbsp; yield<br />
end</div></div>

<p>namespaceというメソッドをトップレベルに定義しておく。このメソッドはブロックの内容を実行するだけ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">get '/users' do<br />
&nbsp; 'Users Index'<br />
end<br />
get '/users/new' do<br />
&nbsp; 'New User'<br />
end<br />
get '/todos' do<br />
&nbsp; 'Todos Index'<br />
end<br />
get '/todos/:id' do<br />
&nbsp; &quot;Show Todo #{params[:id]}&quot;<br />
end</div></div>

<p>これが</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">namespace '/users' do<br />
&nbsp; get '/users' do<br />
&nbsp; &nbsp; 'Users Index'<br />
&nbsp; end<br />
&nbsp; get '/users/new' do<br />
&nbsp; &nbsp; 'New User'<br />
&nbsp; end<br />
end<br />
namespace '/todos' do<br />
&nbsp; get '/todos' do<br />
&nbsp; &nbsp; 'Todos Index'<br />
&nbsp; end<br />
&nbsp; get '/todos/:id' do<br />
&nbsp; &nbsp; &quot;Show Todo #{params[:id]}&quot;<br />
&nbsp; end<br />
end</div></div>

<p>こう書けるようになる。</p>

<p>少し見やすい</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/799/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FLASHer のためのSinatra入門 [導入編]</title>
		<link>http://www.func09.com/wordpress/archives/764</link>
		<comments>http://www.func09.com/wordpress/archives/764#comments</comments>
		<pubDate>Tue, 16 Feb 2010 08:33:01 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[flash]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[sinatra]]></category>
		<category><![CDATA[未分類]]></category>
		<category><![CDATA[erb]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=764</guid>
		<description><![CDATA[はじめに こんにちはーFlasherのみなさん。 すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。 久しぶりにFLASHerのための記事を書けそうです。 今日とりあげるのは [...]]]></description>
			<content:encoded><![CDATA[<h2>はじめに</h2>

<p>こんにちはーFlasherのみなさん。<br />
すっかりRuby記事ばっかりなのに、いまだにブログ訪問者の大半はFlasherらしいこのブログ。<br />
久しぶりにFLASHerのための記事を書けそうです。</p>

<p>今日とりあげるのは<a href="http://www.sinatrarb.com/">Sinatra</a>というRubyで作られた超シンプルなフレームワークです。<br /></p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">require 'rubygems'<br />
require 'sinatra'<br />
get '/hi' do<br />
&nbsp; &quot;Hello World!&quot;<br />
end</div></div>

<p>このたった5行で、http://localhost:4567/hi にアクセスすると「Hello World!」というテキストを返すAPIサーバがローカルPC上に完成するんだ。</p>

<p>Rubyがわからなくたって、どんなプログラムなのか一目瞭然だ。シンプルだと思わないかい？<br />
<strong>今回はこのシンプルなSinatraを使って、あなたのFlash案件に使える、より本番に近いモックAPIサーバを作ろうというお話です。</strong></p>

<p><span id="more-764"></span></p>

<h2>この記事の対象者</h2>

<ul>
<li>サーバ連携なFlash案件が多いFlash開発者</li>
<li>Macユーザー（Windowsの人もインストール編以外は共通だと思う）</li>
<li>ターミナル.appが少しは触れる人（達人じゃなくてよい）</li>
</ul>

<h2>今回のシチュエーション</h2>

<p>FlashでToDo管理アプリを作ることになった。
まずはToDoの一覧をサーバからXMLで取得して、それが表示できるようにしたい。</p>

<p>APIのURLと、どんなXMLが返ってくるかは決まっているんだけど、肝心なサーバ側は完成していないどころかリリース前日には出来上がるスケジュールらしい。
こうなったら自分でダミーAPIを用意しながら開発するしかない。</p>

<p>ToDo一覧を取得するAPIと返ってくるXMLのサンプル<br />
<strong>http://example.jp/api/todolist</strong></p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;todo id=‘1’&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;todo id=‘2’&gt;<br />
&nbsp; &nbsp; &lt;title&gt;企画書を提出する&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&lt;/todos&gt;</div></div>

<h2>効率よく開発を進めるためのFlashの設計</h2>

<p>さて、上記のようなシチュエーションの場合、ローカルにダミーXMLを配置して、それを読み込むというのが一番てっとり早い開発手法なんだと思う。
しかしAPIの種類が100種類とか膨大だったり、同じAPIでもパラメーターで返却のバリエーションが変わるとか想定すると、<strong>本番により近いAPIモックを用意できるのがベスト</strong>だ。</p>

<p>例えば本番APIとドメイン以外まったくURLが同じという構成があったら、Flashの設計も随分綺麗になると思うよ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">import flash.events.*;<br />
import flash.net.*;<br />
<br />
// 実行環境をSWF起動時に設定する<br />
var environment:String = 'development';<br />
<br />
// 設定<br />
var setting:Object = {<br />
&nbsp; production: { // 本番用<br />
&nbsp; &nbsp; host: 'http://example.jp'<br />
&nbsp; },<br />
&nbsp; development: { // 開発用<br />
&nbsp; &nbsp; host: 'http://localhost:4567'<br />
&nbsp; }<br />
};<br />
<br />
// ローダー<br />
var request:URLRequest = new URLRequest(setting[environment].host.concat('/api/todolist'));<br />
var loader:URLLoader = new URLLoader();<br />
loader.addEventListener(Event.COMPLETE, function(e:Event) {<br />
&nbsp; trace(URLLoader(e.target).data);&nbsp; &nbsp; &nbsp; &nbsp;<br />
});<br />
loader.load(request);</div></div>

<p>上のコードでは、「environment」変数の中身がdevelopmentなら開発環境用のAPIを、productionなら本番環境用のAPIをリクエストする。</p>

<h2>インストール編</h2>

<p>ここからはSinatraをインストールする話</p>

<p>Sinatraでモックサーバを作るには最低でも以下のようなものが要求されるよ、がんばれ！</p>

<ul>
<li>ターミナル.appの操作</li>
<li>ruby</li>
<li>rubygems</li>
<li>sinatra</li>
</ul>

<p>まずはターミナル.appを起動しよう。Macの「/アプリケーション/ユーティリティ/」に入っている。これを機会にターミナルをDockに入れておいたら周りの同僚に一目おかれるかもね。</p>

<p>起動したらRubyが入っているか確認だ。MacOS10.4くらいからRubyは最初から入っているはず。最新の10.6ならRubyのバージョンは1.8.7のはずだ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">% ruby -v<br />
ruby 1.8.7 (2008-08-11 patchlevel 72) [universal-darwin10.0]</div></div>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/b6a800e18860f12ebd76a523990cf2c6.jpeg"><img src="http://www.func09.com/wordpress/wp-content/uploads/b6a800e18860f12ebd76a523990cf2c6.jpeg" alt="" title="b6a800e18860f12ebd76a523990cf2c6" width="555" height="383" class="alignnone size-full wp-image-777" /></a></p>

<p>次にrubygemsのバージョン確認。rubygemsはrubyのサードアプリをインストールしたりするための管理ツールだよ。
今回のSinatraもそうだし、有名なRuby on Railsもrubygemsでインストールできるんだ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">% gem -v<br />
1.3.5</div></div>

<p>ひょっとしたらバージョンは1.3.5より低いかも。そのままでも大丈夫だと思うけどアップグレードするなら。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">% sudo gem update —system</div></div>

<p>でアップグレードしよう。</p>

<h2>Sinatraのインストール</h2>

<p>さて、RubyGemでお目当てのSinatraをインストールする。ついでに他にも使えそうなライブラリをいれておくよ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo gem install sinatra haml rack shotgun</div></div>

<p>パスワードを要求されるので、自分のアカウントのパスワードを入力しよう。するとインストールが始まる。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/970982c1dd8150caf002aac66b4a67b6.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/970982c1dd8150caf002aac66b4a67b6.jpg" alt="" title="ターミナル — zsh — 65×19-1" width="559" height="385" class="alignnone size-full wp-image-780" /></a></p>

<p>お疲れ様でした！あとはダミーサーバを書くだけだ。</p>

<h2>さぁ、SinatraでダミーAPIを書くんだ！</h2>

<p>ここまで準備ができたら、Flashプロジェクトの中にでもsinatra用のディレクトリ「mock」を作る。全体の構成はこんな感じにしたよ。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/mytodos.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/mytodos.jpg" alt="" title="mytodos" width="505" height="203" class="alignnone size-full wp-image-782" /></a></p>

<p>mockディレクトリの中にapp.rbというテキストファイルを作成して、エディタで以下のように書く。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">require 'rubygems'<br />
require 'sinatra'<br />
get '/api/todolist' do<br />
&nbsp; 'Hello World!'<br />
end</div></div>

<p>そして、ターミナルでプロジェクトのmockディレクトリまで移動してサーバを起動しよう。
え？ターミナルでmockディレクトリまで移動ができない？
デスクトップにmytodosプロジェクトフォルダがあるなら</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">% cd ~/Desktop/mytodos/mock</div></div>

<p>と入力してエンターだ。</p>

<p>それでもわからなかったら、「cd 」とだけ書いて、移動したいフォルダをターミナルへドラッグドロップでもオッケー。</p>

<p>そしてサーバ起動だ。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">% ruby app.rb</div></div>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/4db5c451888a5a100ff25f52c3556d17.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/4db5c451888a5a100ff25f52c3556d17.jpg" alt="" title="ターミナル — ruby — 65×19" width="556" height="386" class="alignnone size-full wp-image-784" /></a></p>

<p>こんな感じになってるかな？</p>

<p>なっていれば、君による君だけのAPIサーバが起動した。おめでとう！
そうそう、サーバを止めたい時はCTRL+Cを押すんだよ。</p>

<p>ブラウザで <a href="http://localhost:4567/api/todolist">http://localhost:4567/api/todolist</a>アクセスしてみよう。</p>

<p><a href="http://www.func09.com/wordpress/wp-content/uploads/http___localhost_4567_api_todolist.jpg"><img src="http://www.func09.com/wordpress/wp-content/uploads/http___localhost_4567_api_todolist.jpg" alt="" title="http___localhost_4567_api_todolist" width="518" height="318" class="alignnone size-full wp-image-786" /></a></p>

<p>すごい！完璧だ！サーバサイドエンジニアになれるんじゃないか？！</p>

<h2>モックAPIを作る</h2>

<p>僕らの目的は「Hello World」を表示することじゃない。XMLを返すサーバを作ることだから先を急ぐよ。</p>

<p>mock/app.rbをちょっと変更してきちんとXMLを返すようにしてみるよ</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">require 'rubygems'<br />
require 'sinatra'<br />
get '/api/todolist' do<br />
&nbsp; content_type 'xml'<br />
&nbsp; erb :api_todolist<br />
end</div></div>

<p>そして、mock/views/api_todolist.erb というファイルを作成して</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;todo id='1'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;todo id='2'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;企画書を提出する&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&lt;/todos&gt;</div></div>

<p>としよう。</p>

<p>ブラウザでアクセスすれば、今度はXMLが返ってくるようになったはずだ。</p>

<p>簡単に説明すると、「content_type ‘xml’」でXMLとしてレスポンスを返すように定義して、
「erb :api_todolist」で views/api_todolist.erbというテンプレートファイルを出力してね。</p>

<p>ということになる。ERBというのはRubyでスタンダードなテンプレートシステムだ。<br />
参考：<a href="http://www.druby.org/ilikeruby/erb.html">http://www.druby.org/ilikeruby/erb.html</a></p>

<h2>もうちょっと高度なことをする</h2>

<p>これじゃローカルにXMLを置くのと変わらないよドラえもーん、と嘆いている、そこののび太くん。
ERBを使えば繰り返しが可能なので、例えば999件のXMLを返したい時はこうだ。</p>

<p>mock/views/api_todolist を修正</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;% 999.times do |id| %&gt;<br />
&nbsp; &lt;todo id='&lt;%= id %&gt;'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;牛乳を買って帰る &lt;%= id %&gt;&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&lt;/todos&gt;</div></div>

<p>数値.times do ~ end で数値分繰り返し処理されるのはRuby独特の書き方だ。</p>

<h2>さらに高度なことをする</h2>

<p>単純な繰り返しじゃいやだ！自分でレコードを作りたい！でもデータベースは嫌だ！
OK。ならこうだ。</p>

<p>mock/app.rb修正</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">require 'rubygems'<br />
require 'sinatra'<br />
get '/api/todolist' do<br />
&nbsp; # TODOの配列を作る %w はRubyの配列式<br />
&nbsp; @todos = %w{<br />
&nbsp; &nbsp; コンビニに寄る<br />
&nbsp; &nbsp; ジャンプを立ち読みする<br />
&nbsp; &nbsp; 牛乳をレジへ持っていく<br />
&nbsp; &nbsp; 178円払う<br />
&nbsp; &nbsp; 店員さんにありがとうと言う<br />
&nbsp; &nbsp; 牛乳を買って帰る<br />
&nbsp; &nbsp; 牛乳を冷蔵庫へしまう<br />
&nbsp; }<br />
&nbsp; content_type 'xml'<br />
&nbsp; erb :api_todolist<br />
end</div></div>

<p>mock/views/api_todolist.erb修正</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;<br />
&lt;todos&gt;<br />
&nbsp; &lt;% @todos.each_with_index do |todo, id| %&gt;<br />
&nbsp; &lt;todo id='&lt;%= id %&gt;'&gt;<br />
&nbsp; &nbsp; &lt;title&gt;&lt;%= todo %&gt;&lt;/title&gt;<br />
&nbsp; &lt;/todo&gt;<br />
&nbsp; &lt;% end %&gt;<br />
&lt;/todos&gt;</div></div>

<p>app.rbで設定した@todosをテンプレートからアクセスしている。<br />
@todos.each_with_index do |element, index| ~ end という形もRubyでは日常茶飯事に使われる配列の繰り返し方。</p>

<h2>さいごに</h2>

<p>ざっとFLASHerがSinatraを使ってモックサーバを用意する方法を書いてみた。</p>

<p>Sinatra側のコードは書き換える度にサーバを再起動する必要があるから注意してね。
それがめんどくさい場合はshotgunコマンドを使うと、再起動の心配は必要無くなる。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">% shotgun app.rb</div></div>

<p>駆け足だったので、もっと具体的なことをしたいとか、これはどーやって実現するんだ？という質問があったら、コメントなりメールなり<a href="http://twitter.com/func09">@func09</a>なりへどうぞ。</p>

<p>それから、モックサーバを作るためにRubyにハマりすぎると、僕みたいにFlasherを引退してまでRubyを書くことになっちゃうからほどほどにね。</p>

<p>enjoy flash and ruby!</p>

<p>参考URL: <a href="http://d.hatena.ne.jp/seiunsky/20091108/1257695951">AS3でちょっとしたサーバサイドのプログラムが必要になる時に毎回書くのが面倒なので、適当に sinatra で書いた</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/764/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[rails] BackgrounDRbのメモ</title>
		<link>http://www.func09.com/wordpress/archives/688</link>
		<comments>http://www.func09.com/wordpress/archives/688#comments</comments>
		<pubDate>Wed, 30 Sep 2009 08:12:43 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=688</guid>
		<description><![CDATA[個人的メモ 結構リソース食うので次はdelayed_jobにしたい・・ 実行してことはあるけど、正常に終了してないキューを取得する BdrbJobQueue.find(:all, :conditions =&#62; [' [...]]]></description>
			<content:encoded><![CDATA[<p>個人的メモ</p>

<p>結構リソース食うので次はdelayed_jobにしたい・・</p>

<h2>実行してことはあるけど、正常に終了してないキューを取得する</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BdrbJobQueue.find(:all, :conditions =&gt; ['finished = ? AND taken = ?',0,1])</div></div>

<h2>キューをもう一回実行させる</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BdrbJobQueue#release_job</div></div>

<h2>上の合わせ技</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">BdrbJobQueue.find(:all, :conditions =&gt; ['finished = ? AND taken = ?',0,1]).each do |job|<br />
&nbsp; job.release_job<br />
end</div></div>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/688/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails] paperclipでAmazon CloudFrontを使う</title>
		<link>http://www.func09.com/wordpress/archives/680</link>
		<comments>http://www.func09.com/wordpress/archives/680#comments</comments>
		<pubDate>Thu, 10 Sep 2009 10:55:11 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[aws]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=680</guid>
		<description><![CDATA[Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。 前回paperclipからS3を使う設定はわかったので、今回はさらにCloudFrontを利用するための設定です 前 [...]]]></description>
			<content:encoded><![CDATA[<p>Amazon CloudFrontはAmazon S3上のファイルをキャッシュするソリューションです。</p>

<p><a href="http://www.func09.com/wordpress/archives/674">前回paperclipからS3を使う設定</a>はわかったので、今回はさらにCloudFrontを利用するための設定です</p>

<h2>前回のおさらい</h2>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">has_attached_file :avatar,<br />
&nbsp; :storage =&gt; :s3,<br />
&nbsp; :s3_credentials =&gt; &quot;#{RAILS_ROOT}/config/s3.yml&quot;,<br />
&nbsp; :path =&gt; &quot;:attachment/:id/:style.:extension&quot;,<br />
&nbsp; :bucket =&gt; 'mybucket'</div></div>

<p>前回こんな感じでS3の設定をしました。</p>

<p>コンソールから利用してみると</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = User.new<br />
user.avatar = File.open('/tmp/myface.jpg')<br />
user.save<br />
<br />
puts user.avatar.url #=&gt; http://mybucket.s3.amazonaws.com/avatar/1/original.jpg</div></div>

<p>こんな感じでS3のURLがとれるようになっているはず。</p>

<h2>s3_host_aliasを効かす</h2>

<p>キャッシュサービスであるCloudFrontを利用する場合は、ホスト名を適宜変えるだけなので
paperclipが勝手にやってくれるといいなぁ〜なんて思いました。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">has_attached_file :avatar,<br />
&nbsp; :storage =&gt; :s3,<br />
&nbsp; :s3_credentials =&gt; &quot;#{RAILS_ROOT}/config/s3.yml&quot;,<br />
&nbsp; :path =&gt; &quot;:attachment/:id/:style.:extension&quot;,<br />
&nbsp; :bucket =&gt; 'mybucket',<br />
&nbsp; :s3_host_alias =&gt; &quot;xxxxxxxxxxxx.cloudfront.net&quot;,<br />
&nbsp; :url =&gt; &quot;:s3_alias_url&quot;</div></div>

<p>オプションが２つ増えてます</p>

<ul>
<li>:s3_host_alias は、エイリアスのFQDNを記述しておきます。</li>
<li>:url には「&#8221;:s3_alias_url&#8221;」を記述します。注意なのは、rubyのシンボルじゃなくて、文字列だってところです。ハマりました。</li>
</ul>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">user = User.new<br />
user.avatar = File.open('/tmp/myface.jpg')<br />
user.save<br />
<br />
puts user.avatar.url #=&gt; http://xxxxxxxxxxxx.cloudfront.net/avatar/1/original.jpg</div></div>

<p>わーーこりゃ幸せだ。</p>

<h2>余談</h2>

<p>さらにサイト全体でアセット関係（public以下）もCloudFrontにしたければ</p>

<p>config/environments/#{RAILS_ENV}.rb 内で</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config.action_controller.asset_host = &quot;http://xxxxxxxxxxxx.cloudfront.net&quot;</div></div>

<p>こうしとけば、image_path()やらimage_tag()やらjavascript_include_tag()やらを使ったときに、リクエスト先を書き換えてくれてさらに幸せ度アップ</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/680/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails] map.resourcesでいらないアクションを外す</title>
		<link>http://www.func09.com/wordpress/archives/671</link>
		<comments>http://www.func09.com/wordpress/archives/671#comments</comments>
		<pubDate>Fri, 04 Sep 2009 08:50:37 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=671</guid>
		<description><![CDATA[こんにちは、久々ですね Railsでroutes.rbは本当に便利ですよね。 map.resources :users なんて書くだけで、RESTFulなAPIが用意されます。 index new create show [...]]]></description>
			<content:encoded><![CDATA[<p>こんにちは、久々ですね</p>

<p>Railsでroutes.rbは本当に便利ですよね。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">map.resources :users</div></div>

<p>なんて書くだけで、RESTFulなAPIが用意されます。</p>

<ul>
<li>index</li>
<li>new</li>
<li>create</li>
<li>show</li>
<li>edit</li>
<li>update</li>
<li>destroy</li>
</ul>

<p>に対応したURLをRailsがよしなにやってくれますよね。</p>

<p>しかし、こんなにたくさんのアクションはいらないー。わしゃcreateとshowだけでいいんじゃーなんて時もあったりします。そんなときは</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">map.resources :users, :only =&gt; ['create','show']</div></div>

<p>として、必要なアクションだけ列挙しましょう。</p>

<p>また、:exceptなんてオプションもあって、必要ないオプションを列挙します。</p>

<p>このへんに<a href="http://railsapi.com/doc/rails-v2.3.4/classes/ActionController/Resources.html#M005380">かいてありました</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/671/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mitaka.rb #4 行ってきました</title>
		<link>http://www.func09.com/wordpress/archives/668</link>
		<comments>http://www.func09.com/wordpress/archives/668#comments</comments>
		<pubDate>Wed, 26 Aug 2009 04:27:24 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[日記]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[三鷹]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/archives/668</guid>
		<description><![CDATA[Mitaka.rbの第四回に行ってきました。 今回は吉祥寺のepicesという店を借り切って、美味しいものが食べたけりゃMitaka.rbへおいでってな感じです。 後半はフレンチを食べながらLTを見るという、貴重な体験も [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.func09.com/wordpress/wp-content/uploads/2009/08/img_0282.jpg" alt="img_0282" title="img_0282" width="400" class="alignnone size-full wp-image-666" /></p>

<p><img src="http://www.func09.com/wordpress/wp-content/uploads/2009/08/img_0281.jpg" alt="img_0281" title="img_0281" width="400" class="alignnone size-full wp-image-667" /></p>

<p><a href="http://atnd.org/events/1159">Mitaka.rbの第四回</a>に行ってきました。</p>

<p>今回は吉祥寺のepicesという店を借り切って、美味しいものが食べたけりゃMitaka.rbへおいでってな感じです。</p>

<p>後半はフレンチを食べながらLTを見るという、貴重な体験もできましたよ。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/668/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[ruby] gem updateかけたらautotestが動かなくなった</title>
		<link>http://www.func09.com/wordpress/archives/629</link>
		<comments>http://www.func09.com/wordpress/archives/629#comments</comments>
		<pubDate>Thu, 23 Jul 2009 02:06:33 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=629</guid>
		<description><![CDATA[Railsが2.3.3に上がったので、gemをアップグレードしたりパッケージをアップデートしたりしているうちに script/autospecが動かなくなってしまった。 解決方法はここを参考にしました ZenTestを4 [...]]]></description>
			<content:encoded><![CDATA[<p>Railsが2.3.3に上がったので、gemをアップグレードしたりパッケージをアップデートしたりしているうちに<br />
script/autospecが動かなくなってしまった。</p>

<p>解決方法はここを参考にしました</p>

<p>ZenTestを4.0系→4.1系にバージョンアップする場合の注意点<br />
<a href="http://d.hatena.ne.jp/TrinityT/20090630/1246334665">http://d.hatena.ne.jp/TrinityT/20090630/1246334665</a></p>

<ul>
<li>autotest-railsをインストール</li>
</ul>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo gem install autotest-rails</div></div>

<ul>
<li>ZenTest-4.0.0/lib/autotest/*をZenTest-4.1.3/lib/autotest/ へコピー</li>
</ul>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># Macではこんな感じ<br />
sudo rsync -ave /Library/Ruby/Gems/1.8/gems/ZenTest-4.0.0/lib/autotest/ /Library/Ruby/Gems/1.8/gems/ZenTest-4.1.3/lib/autotest</div></div>

<p>これでまたscript/autospecが使えるようになりました。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/629/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[rails]has_manyなフィクスチャを書くのに疲れたらFactory Girlがオススメ！</title>
		<link>http://www.func09.com/wordpress/archives/532</link>
		<comments>http://www.func09.com/wordpress/archives/532#comments</comments>
		<pubDate>Sat, 25 Apr 2009 16:12:39 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby]]></category>
		<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[日記]]></category>
		<category><![CDATA[factorygirl]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rspec]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=532</guid>
		<description><![CDATA[フィクスチャはメンテナンスしづらい 書籍The Rails Wayの中には「皆フィクスチャが嫌い」という項目があります（次の項目は「フィクスチャはそれほど悪くない」ですが）。 フィクスチャが嫌われる最大の原因は「メンテナ [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.func09.com/wordpress/wp-content/uploads/2009/04/factorygirl.jpg" alt="factorygirl" title="factorygirl" width="568" height="160" class="alignnone size-full wp-image-557" /></p>

<h2>フィクスチャはメンテナンスしづらい</h2>

<p>書籍<a href="http://www.amazon.co.jp/o/ASIN/4798116998">The Rails Way</a>の中には「皆フィクスチャが嫌い」という項目があります（次の項目は「フィクスチャはそれほど悪くない」ですが）。</p>

<p>フィクスチャが嫌われる最大の原因は「メンテナンスが難しい」という事でしょう。<br />
中間テーブルを必要とする多対多の関連をフィクスチャにしようと思ってうんざりした経験は誰にもでもあると思います。</p>

<p>Fixtureのhas_manyでこんな書き方したい<br />
<a href="http://www.func09.com/wordpress/archives/369">http://www.func09.com/wordpress/archives/369</a></p>

<h2>フィクスチャの代わりにFactoryGirlを使ってみる</h2>

<p><a href="http://www.thoughtbot.com/projects/factory_girl/">Factory Girl</a>はRailsのテストにおいてfixtureの代替となるツールです。<br />
つまりテスト時のモデルデータを用意するための仕組みです。<br />
<a href="http://www.thoughtbot.com/projects/factory_girl/">Factory Girl</a>はフィクスチャと違い、Rubyのスクリプトで直接データを定義していきます。</p>

<p>特徴としては</p>

<ul>
<li>Rubyコードで定義（YAMLやCSVではない）</li>
<li>関連のメンテナンスが楽</li>
<li>定義の継承もできる</li>
<li>同じ定義から連続的なデータを生成できる（シーケンス）</li>
</ul>

<p>Rubyコードで実データを作る感覚でテストデータを定義するので、フィクスチャと違い中間テーブルのメンテナンスから解放されます。
<span id="more-532"></span></p>

<h2>インストール</h2>

<p>インストールはgemで簡単にインストールできます。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo gem install thoughtbot-factory_girl --source http://gems.github.com</div></div>

<p>config/environment.rbに依存するgemとして登録しておくと、テスト実行時に自動でFactory Girlがロードされるので便利です。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">config.gem &quot;thoughtbot-factory_girl&quot;, :lib =&gt; &quot;factory_girl&quot;, :source =&gt; &quot;http://gems.github.com&quot;</div></div>

<h2>実際にサンプルを作ってみる</h2>

<p>定義の継承やシーケンスといった機能も便利なのですが、とりあえず<strong>最大のメリットである複雑な関連をシンプルに定義できる</strong>という事を簡単なサンプルで証明したいと思います。</p>

<p>User,Page,Bookmarkという３つのモデルで簡単なブックマークアプリを作ります。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># app/models/user.rb<br />
class User &lt; ActiveRecord::Base<br />
&nbsp; # name:string<br />
&nbsp; has_many :bookmarks<br />
&nbsp; has_many :pages, :through =&gt; :bookmarks<br />
end<br />
<br />
# app/models/page.rb<br />
class Page &lt; ActiveRecord::Base<br />
&nbsp; # title:string<br />
&nbsp; # url:string<br />
&nbsp; has_many :bookmarks<br />
&nbsp; has_many :users, :through =&gt; :bookmarks<br />
end<br />
<br />
# app/models/bookmark.rb<br />
class Bookmark &lt; ActiveRecord::Base<br />
&nbsp; # user_id:integer<br />
&nbsp; # page_id:integer<br />
&nbsp; belongs_to :user<br />
&nbsp; belongs_to :page<br />
end</div></div>

<p>UserとPageがBookmarkを中間テーブルとして多対多の関係になっています。</p>

<h2>ファクトリーを定義する</h2>

<p>Factory Girlは特定のクラスに対して名前を付けて雛形を定義することができます。</p>

<p>spec/factories.rbというファイルを作成し（rspecを使う場合）、次のように記述します</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Factory.define :bob, :class =&gt; User do |f|<br />
&nbsp; f.name &quot;bob&quot;<br />
end<br />
<br />
Factory.define :mike, :class =&gt; User do |f|<br />
&nbsp; f.name &quot;mike&quot;<br />
end<br />
<br />
Factory.define :yahoo, :class =&gt; Page do |f|<br />
&nbsp; f.title &quot;Yahoo!&quot;<br />
&nbsp; f.url &quot;http://www.yahoo.com/&quot;<br />
end<br />
<br />
Factory.define :google, :class =&gt; Page do |f|<br />
&nbsp; f.title &quot;Google&quot;<br />
&nbsp; f.url &quot;http://www.google.com/&quot;<br />
end</div></div>

<p>specもしくはtestディレクトリにfactories.rbというファイルか、factories/というディレクトリ内にrbファイルを配置すれば、自動的にFactoryGirlで定義が利用可能となります。</p>

<p>FactoryGirlは<b>Factory.define(name,options)</b>メソッドでテスト用のモデルインスタンスを作成する工場を定義していきます。</p>

<p>nameにはユニークな定義名を、optionsにはHashを渡します。とりあえず:classオプションがモデルクラスを指定することだけ覚えておきましょう。</p>

<p>ブロック引数に渡したfはfactoryインスタンスです。モデルに指定したattributeの雛形を定義しておきます。</p>

<p>ここではbobとmikeというユーザー、yahooとgoogleというページを定義しました。</p>

<h2>テストから利用する</h2>

<p>では実際にテストコードからFactoryGirlを利用してみます。
先ほど定義したファクトリーを使ってインスタンス化する場合は</p>

<ul>
<li>Factory.create(name)</li>
<li>Factory.build(name)</li>
</ul>

<p>を使います。createは保存したインスタンスを、buildは保存前のインスタンスを返すようになっていて、createはデフォルトの場合、次のようなショートハンドが使えます。</p>

<ul>
<li>Factory(name)</li>
</ul>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"># spec/models/user_spec.rb<br />
require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')<br />
describe User do<br />
&nbsp; it &quot;正常に保存できること&quot; do<br />
&nbsp; &nbsp; @user = Factory.build(:bob)<br />
&nbsp; &nbsp; @user.save.should be_true<br />
&nbsp; end<br />
end</div></div>

<p>テストを実行すると、ちゃんと動いているのがわかります。
Factory.buildで取得できるオブジェクトはスタブやモックではなく、れっきとしたモデルクラスのインスタンスなので当然saveなどのメソッドが使えます。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">User<br />
- 正常に保存できること<br />
<br />
Finished in 0.067948 seconds<br />
<br />
1 example, 0 failures</div></div>

<h2>関連を定義する</h2>

<p>ここまでは普通のフィクスチャでも当然できますので、フィクスチャだったら面倒くさい多対多の関連を定義します。</p>

<p>bobが２つのブックマークを、mikeが１つのブックマークを持っていることをFactory Girlで書くにはどうすれば良いでしょうか？</p>

<p>そのためのテストコードを追加しておきましょう。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">it &quot;ボブはブックマークを２つ持っていること&quot; do<br />
&nbsp; @bob = Factory(:bob)<br />
&nbsp; @bob.should have(2).bookmarks<br />
end<br />
<br />
it &quot;マイクはブックマークを１つ持っていること&quot; do<br />
&nbsp; @mike = Factory(:mike)<br />
&nbsp; @mike.should have(1).bookmarks<br />
end</div></div>

<p>テストが赤で失敗するのを確認したら、ファクトリーの定義を修正します。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">#spec/factories.rb<br />
Factory.define :bob, :class =&gt; User do |f|<br />
&nbsp; f.name &quot;bob&quot;<br />
&nbsp; f.pages {<br />
&nbsp; &nbsp; [Factory(:google),Factory(:yahoo)]<br />
&nbsp; }<br />
end<br />
<br />
Factory.define :mike, :class =&gt; User do |f|<br />
&nbsp; f.name &quot;mike&quot;<br />
&nbsp; f.pages {<br />
&nbsp; &nbsp; [Factory(:google)]<br />
&nbsp; }<br />
end</div></div>

<p>これでOKです。簡単でしょ？どのユーザーがどのページを持っているか？直感的に書けることと、中間テーブルであるブックマークについて何も書かれていないことに注目してください。</p>

<p>それぞれのUserが持っているpagesを配列で指定しています。
この時、{}というブロックで渡すとFactoryGirlは遅延処理と見なしてくれるので、実際にpagesが呼ばれるまで定義は反映されません。</p>

<p>配列にはFactory(name)で、定義したファクトリーからインスタンスを生成します。</p>

<p>これでテストがグリーンになることを確認できました。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">User<br />
- 正常に保存できること<br />
- ボブはブックマークを２つ持っていること<br />
- マイクはブックマークを１つ持っていること<br />
<br />
Finished in 0.152733 seconds<br />
<br />
3 examples, 0 failures</div></div>

<h2>最後に</h2>

<p>どうでしょうか？FactoryGIrl。
最近よく名前を聞くのに日本語で使い方を説明しているサイトが見つからなかったので、駆け足で使い方を説明してみました。</p>

<p>フィクスチャはやっぱり便利なところもあるので、使いたいのだけれど関連が絡んでくると一気にモチベーションが下がりますよね。
FactoryGirlはちょっと冗長だけれど、無理なく関連を管理できるので、これまでフィクスチャに悩まされてきた人にはおすすめです。</p>

<ul>
<li>サンプル on Github

<ul>
<li><a href="http://github.com/func09/bookmark-factorygirl-sample/tree/master">http://github.com/func09/bookmark-factorygirl-sample/tree/master</a></li>
</ul></li>
</ul>

<h2>参考</h2>

<ul>
<li><a href="http://railscasts.com/episodes/158-factories-not-fixtures">http://railscasts.com/episodes/158-factories-not-fixtures</a></li>
<li><a href="http://www.thoughtbot.com/projects/factory_girl/">http://www.thoughtbot.com/projects/factory_girl/</a></li>
<li><a href="http://github.com/thoughtbot/factory_girl/tree/master">http://github.com/thoughtbot/factory_girl/tree/master</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/532/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>テストでスタブの掛け方に悩み中</title>
		<link>http://www.func09.com/wordpress/archives/530</link>
		<comments>http://www.func09.com/wordpress/archives/530#comments</comments>
		<pubDate>Thu, 23 Apr 2009 18:01:03 +0000</pubDate>
		<dc:creator>haga</dc:creator>
				<category><![CDATA[ruby on rails]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rspec]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://www.func09.com/wordpress/?p=530</guid>
		<description><![CDATA[例えばActiveRecordで新規作成したタイミングでリモートにアクセスするような処理があったとして class Item &#60; ActiveRecord::Base &#160; before_create :d [...]]]></description>
			<content:encoded><![CDATA[<p>例えばActiveRecordで新規作成したタイミングでリモートにアクセスするような処理があったとして</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Item &lt; ActiveRecord::Base<br />
&nbsp; before_create :do_something_with_remote<br />
&nbsp; def do_something_with_remote<br />
&nbsp; &nbsp; open(self.url)<br />
&nbsp; end<br />
end</div></div>

<p>この場合、テストの時はItem#do_something_with_remoteをスタブにするよね。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">item = Item.new :url =&gt; 'http://www.example.com'<br />
item.stub! :do_something_with_remote</div></div>

<p>本当はこんな感じでかけたい</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Item.stub_instance_method(:do_something_with_remote)</div></div>

<p>stubはそのオブジェクトにしか使えない？インスタンスメソッドまで影響するスタブはどう書けば良い？</p>

<p>&#8211;</p>

<p>Fixtureの代わりにFactoryGirlを使い始めた。
これがなかなかシンプルで使い勝手が良いんだけど、関連を設定する時に上記のような作りの場合にちょっと困っている。
Factory.defineの中でインスタンスのメソッドにstubを設定できればいいんだよな。</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Factory.define :item, :class =&gt; Item do |item|<br />
&nbsp; item.stub!(:do_something_with_remote)<br />
end</div></div>

<p>明日改造できるかソースコードを見てみる。
Factory.stubはあるんだし、できないことはないよな。</p>

<p>今は時間がないのでスペックヘルパーで</p>

<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Item<br />
&nbsp; def do_something_remote;end<br />
end</div></div>

<p>みたいに上書きして対処しているが・・・駄目だよな。<br />
FactoryGirlに関してはノウハウが溜まったら書くかも。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.func09.com/wordpress/archives/530/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

