<?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>GravityBlast &#187; Ruby</title>
	<atom:link href="http://gravityblast.com/category/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://gravityblast.com</link>
	<description>...coding blast beat!</description>
	<lastBuildDate>Tue, 28 Sep 2010 11:57:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>web-app-theme 0.6.1 for rails 3</title>
		<link>http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/</link>
		<comments>http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/#comments</comments>
		<pubDate>Mon, 27 Sep 2010 23:18:18 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=421</guid>
		<description><![CDATA[The new version of web-app-theme finally supports Rails 3. Check out the repository on github. It also supports Haml template generation using html2haml, like devise does. UPDATE: the version 0.6.2 fixes a bug in the Haml generation when you use form_for blocks. share]]></description>
			<content:encoded><![CDATA[<p>The new version of <a href="http://github.com/pilu/web-app-theme">web-app-theme</a> finally supports Rails 3. Check out the <a href="http://github.com/pilu/web-app-theme">repository on github</a>. It also supports <a href="http://haml-lang.com/">Haml</a> template generation using html2haml, like <a href="http://github.com/plataformatec/devise">devise</a> does.</p>
<p><strong>UPDATE</strong>: the version 0.6.2 fixes a bug in the Haml generation when you use form_for blocks.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;submitHeadline=web-app-theme+0.6.1+for+rails+3&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=web-app-theme+0.6.1+for+rails+3&amp;url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;T=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;title=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+web-app-theme+0.6.1+for+rails+3+@+http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/&amp;t=web-app-theme+0.6.1+for+rails+3" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2010/09/27/web-app-theme-0-6-1-for-rails-3/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ruby library for the musiXmatch API</title>
		<link>http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/</link>
		<comments>http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/#comments</comments>
		<pubDate>Mon, 20 Sep 2010 00:30:22 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=416</guid>
		<description><![CDATA[If you want to search for lyrics and tracks with Ruby using the musiXmatch API, check out my repository at http://github.com/pilu/musix_match share]]></description>
			<content:encoded><![CDATA[<p>If you want to search for lyrics and tracks with Ruby using the <a href="http://musixmatch.com" title="musiXmatch">musiXmatch</a> API, check out my repository at <a href="http://github.com/pilu/musix_match">http://github.com/pilu/musix_match</a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;submitHeadline=Ruby+library+for+the+musiXmatch+API&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Ruby+library+for+the+musiXmatch+API&amp;url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;T=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;title=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Ruby+library+for+the+musiXmatch+API+@+http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/&amp;t=Ruby+library+for+the+musiXmatch+API" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2010/09/20/ruby-library-for-the-musixmatch-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex functional testing with FunFx and Cucumber</title>
		<link>http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/</link>
		<comments>http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/#comments</comments>
		<pubDate>Thu, 20 Aug 2009 13:11:56 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=317</guid>
		<description><![CDATA[Cucumber is a great tool I usually use for BDD in my ruby projects, but yesterday I tried it with Flex, and it was very enjoyable. Here a little example on how to test Flex applications with Cucumber. First of all you need ruby, then you need to install the following gems: sudo gem install [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://cukes.info/">Cucumber</a> is a great tool I usually use for <a href="http://en.wikipedia.org/wiki/Behavior_driven_development" title="Behavior Driven Development">BDD</a> in my ruby projects, but yesterday I tried it with Flex, and it was very enjoyable. Here a little example on how to test Flex applications with Cucumber.</p>
<p>First of all you need ruby, then you need to install the following gems:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> rspec cucumber watir safariwatir funfx</pre></div></div>

<p>(I used the following codes on <strong>mac os x</strong>, with <strong>ruby 1.8.6</strong>, <strong>safari 4.0.3</strong> and <strong>funx 0.2.2</strong>)</p>
<p>After that open Flex Builder and create a new project called CucumberExample and use the following code for your main mxml file:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>xml <span style="color: #004993;">version</span>=<span style="color: #990000;">&quot;1.0&quot;</span> encoding=<span style="color: #990000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application xmlns<span style="color: #000000; font-weight: bold;">:</span>mx=<span style="color: #990000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #990000;">&quot;absolute&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> id=<span style="color: #990000;">&quot;index&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Number<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;300&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;200&quot;</span> <span style="color: #004993;">backgroundColor</span>=<span style="color: #990000;">&quot;white&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;30&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>			
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonDecrement&quot;</span> label=<span style="color: #990000;">&quot;-&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonIncrement&quot;</span> label=<span style="color: #990000;">&quot;+&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;100%&quot;</span> verticalAlign=<span style="color: #990000;">&quot;middle&quot;</span> horizontalAlign=<span style="color: #990000;">&quot;center&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Label id=<span style="color: #990000;">&quot;myLabel&quot;</span> <span style="color: #004993;">text</span>=<span style="color: #990000;">&quot;{index}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span>			
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>As you can see, we have a number, 2 buttons and a label. Now create a directory called features inside your flex project folder and create the first Cucumber feature file, called counter:</p>
<p><strong>CucumberExample/features/counter.feature</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="cucumber" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">Feature</span>: Counter
  <span style="color:#9966CC; font-weight:bold;">In order</span> to count something
  As a flex rock star
  I want to use my great flex app
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Increment index
    <span style="color:#9966CC; font-weight:bold;">Given</span> I open my flex app
    <span style="color:#9966CC; font-weight:bold;">And</span> I click the increment button
    <span style="color:#9966CC; font-weight:bold;">Then</span> the label text should be <span style="color:#996600;">&quot;1&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">When</span> I click the decrement button
    <span style="color:#9966CC; font-weight:bold;">Then</span> the label text should be <span style="color:#996600;">&quot;0&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">When</span> I click the decrement button
    <span style="color:#9966CC; font-weight:bold;">Then</span> the label text should be <span style="color:#996600;">&quot;-1&quot;</span></pre></div></div>

<p>It&#8217;s a test written in pure plain text.</p>
<p>In the <strong>features</strong> folder create another folder called <strong>step_definitions</strong> with a blank file called <strong>counter_steps.rb</strong>, we&#8217;ll use it later.</p>
<p>Now open the console, go the to flex project root and run your test:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>CucumberExample
cucumber features</pre></div></div>

<p>You should see something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">...
<span style="color: #000000;">1</span> scenario <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> undefined<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">7</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">7</span> undefined<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m0.002s</pre></div></div>

<p>You can implement step definitions for undefined steps with these snippets:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^I <span style="color:#CC0066; font-weight:bold;">open</span> my flex app$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I click the increment button$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the label text should be <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>arg1<span style="color:#006600; font-weight:bold;">|</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">When</span> <span style="color:#006600; font-weight:bold;">/</span>^I click the decrement button$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  pending
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Before implementing the steps above, we need to add the funfx component to our library.</p>
<p>Download the latest <strong>swc</strong> file from <a href="http://rubyforge.org/frs/?group_id=3898&#038;release_id=16452">rubyforge</a> and place it in your <strong>CucumberExample/libs</strong> folder (I used the version 0.2.2).</p>
<p>Duplicate the bin-debug folder and rename it to <strong>test</strong> (you have a bin-debug folder after the first time you run the CucumberExample from FlexBuilder).</p>
<p>Inside the test directory create a file called <strong>test_server.rb</strong> with the following content:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'webrick'</span>
&nbsp;
server = <span style="color:#6666ff; font-weight:bold;">WEBrick::HTTPServer</span>.<span style="color:#9900CC;">new</span> <span style="color:#ff3333; font-weight:bold;">:Port</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">9852</span>, <span style="color:#ff3333; font-weight:bold;">:DocumentRoot</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;INT&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span> server.<span style="color:#9900CC;">shutdown</span> <span style="color:#006600; font-weight:bold;">&#125;</span>
server.<span style="color:#9900CC;">start</span></pre></div></div>

<p>Now you need a compiled version of your project that includes funfx.We&#8217;ll use it just for testing:</p>
<p><strong>build_test.sh</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #007800;">FLEX_SDK_HOME</span>=<span style="color: #ff0000;">&quot;/Applications/Adobe Flex Builder 3/sdks/3.2.0&quot;</span>
<span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/bin/mxmlc&quot;</span> <span style="color: #660033;">-verbose-stacktraces</span> <span style="color: #660033;">-include-libraries</span> .<span style="color: #000000; font-weight: bold;">/</span>libs<span style="color: #000000; font-weight: bold;">/</span>funfx-0.2.2.swc <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/frameworks/libs/automation.swc&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/frameworks/libs/automation_dmv.swc&quot;</span>  <span style="color: #ff0000;">&quot;<span style="color: #007800;">$FLEX_SDK_HOME</span>/frameworks/libs/automation_agent.swc&quot;</span> <span style="color: #660033;">-output</span> .<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span><span style="color: #000000; font-weight: bold;">/</span>CucumberExample.swf <span style="color: #660033;">--</span> .<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #000000; font-weight: bold;">/</span>CucumberExample.mxml</pre></div></div>

<p>Run test <strong>compile_test.sh</strong></p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> <span style="color: #000000;">755</span> .<span style="color: #000000; font-weight: bold;">/</span>build_test.sh
.<span style="color: #000000; font-weight: bold;">/</span>build_test.sh</pre></div></div>

<p>Now open another terminal window and start the test server:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>path<span style="color: #000000; font-weight: bold;">/</span>to<span style="color: #000000; font-weight: bold;">/</span>CucumberExample<span style="color: #000000; font-weight: bold;">/</span><span style="color: #7a0874; font-weight: bold;">test</span>
ruby test_server.rb</pre></div></div>

<p>Open http://localhost:9852/CucumberExample.html with your browser and you should see your flex app.</p>
<p>Now you can come back to your features and implement the step we leave before. Here my implementation:</p>
<p><strong>CucumberExample/features/step_definitions/counter_steps.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^I <span style="color:#CC0066; font-weight:bold;">open</span> my flex app$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  open_flex_app
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I click the <span style="color:#006600; font-weight:bold;">&#40;</span>increment<span style="color:#006600; font-weight:bold;">|</span>decrement<span style="color:#006600; font-weight:bold;">&#41;</span> button$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>button<span style="color:#006600; font-weight:bold;">|</span>  
  click_button<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;button#{button.capitalize}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the label text should be <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>text<span style="color:#006600; font-weight:bold;">|</span>
  label_text.<span style="color:#9900CC;">should</span> == text  
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p><strong>open_flex_app</strong>, <strong>click_button</strong> and <strong>label_text</strong> are methods  defined in my <strong>env.rb</strong> file.</p>
<p><strong>CucumberExample/features/support/env.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'funfx/browser/safariwatir'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> FlexWorld
  <span style="color:#9966CC; font-weight:bold;">def</span> open_flex_app
    <span style="color:#0066ff; font-weight:bold;">@browser</span>.<span style="color:#9900CC;">goto</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;http://localhost:9852/CucumberExample.html&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> click_button<span style="color:#006600; font-weight:bold;">&#40;</span>button_id<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@flex_app</span>.<span style="color:#9900CC;">button</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> button_id<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">click</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> label_text
    <span style="color:#0066ff; font-weight:bold;">@flex_app</span>.<span style="color:#9900CC;">label</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:id</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;myLabel&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">text</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Before <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@browser</span>  = <span style="color:#6666ff; font-weight:bold;">Watir::Safari</span>.<span style="color:#9900CC;">new</span>
  <span style="color:#0066ff; font-weight:bold;">@flex_app</span> = <span style="color:#0066ff; font-weight:bold;">@browser</span>.<span style="color:#9900CC;">flex_app</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;CucumberExample&quot;</span>, <span style="color:#996600;">&quot;CucumberExample&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
After <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@browser</span>.<span style="color:#9900CC;">close</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
World<span style="color:#006600; font-weight:bold;">&#40;</span>FlexWorld<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Now you are ready to run your tests.  Start the test_server and then the features. You should have  an error:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Then the label text should be <span style="color: #ff0000;">&quot;1&quot;</span>  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
      expected: <span style="color: #ff0000;">&quot;1&quot;</span>,
           got: <span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>using ==<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>This because we didn&#8217;t implement the functionality yet in our flex app. So, change the mxml file with the following:</p>

<div class="wp_syntax"><div class="code"><pre class="actionscript3" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?</span>xml <span style="color: #004993;">version</span>=<span style="color: #990000;">&quot;1.0&quot;</span> encoding=<span style="color: #990000;">&quot;utf-8&quot;</span><span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application xmlns<span style="color: #000000; font-weight: bold;">:</span>mx=<span style="color: #990000;">&quot;http://www.adobe.com/2006/mxml&quot;</span> layout=<span style="color: #990000;">&quot;absolute&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span><span style="color: #004993;">Number</span> id=<span style="color: #990000;">&quot;index&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #000000; font-weight:bold;">0</span><span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Number<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;300&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;200&quot;</span> <span style="color: #004993;">backgroundColor</span>=<span style="color: #990000;">&quot;white&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;30&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>			
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonDecrement&quot;</span> label=<span style="color: #990000;">&quot;-&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">click</span>=<span style="color: #990000;">&quot;index--&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Button id=<span style="color: #990000;">&quot;buttonIncrement&quot;</span> label=<span style="color: #990000;">&quot;+&quot;</span> <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">click</span>=<span style="color: #990000;">&quot;index++&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
		<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox <span style="color: #004993;">width</span>=<span style="color: #990000;">&quot;100%&quot;</span> <span style="color: #004993;">height</span>=<span style="color: #990000;">&quot;100%&quot;</span> verticalAlign=<span style="color: #990000;">&quot;middle&quot;</span> horizontalAlign=<span style="color: #990000;">&quot;center&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span>
			<span style="color: #000000; font-weight: bold;">&lt;</span>mx<span style="color: #000000; font-weight: bold;">:</span>Label id=<span style="color: #990000;">&quot;myLabel&quot;</span> <span style="color: #004993;">text</span>=<span style="color: #990000;">&quot;{index}&quot;</span><span style="color: #000000; font-weight: bold;">/&gt;</span>			
		<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>HBox<span style="color: #000000; font-weight: bold;">&gt;</span>
	<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>VBox<span style="color: #000000; font-weight: bold;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;/</span>mx<span style="color: #000000; font-weight: bold;">:</span>Application<span style="color: #000000; font-weight: bold;">&gt;</span></pre></div></div>

<p>It&#8217;s the same code but I added the click action to the increment and decrement buttons. Now compile the new code and run the features again:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">.<span style="color: #000000; font-weight: bold;">/</span>build_test.sh
cucumber features</pre></div></div>

<p>You shoiuld have the following output, with all the seven steps passed:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Feature: Counter
  In order to count something
  As a <span style="color: #c20cb9; font-weight: bold;">flex</span> rock star
  I want to use my great <span style="color: #c20cb9; font-weight: bold;">flex</span> app
&nbsp;
  Scenario: Increment index            <span style="color: #666666; font-style: italic;"># features/counter.feature:6</span>
    Given I open my <span style="color: #c20cb9; font-weight: bold;">flex</span> app           <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:1</span>
    And I click the increment button   <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:5</span>
    Then the label text should be <span style="color: #ff0000;">&quot;1&quot;</span>  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
    When I click the decrement button  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:5</span>
    Then the label text should be <span style="color: #ff0000;">&quot;0&quot;</span>  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
    When I click the decrement button  <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:5</span>
    Then the label text should be <span style="color: #ff0000;">&quot;-1&quot;</span> <span style="color: #666666; font-style: italic;"># features/step_definitions/counter_steps.rb:9</span>
&nbsp;
<span style="color: #000000;">1</span> scenario <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #000000;">7</span> steps <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">7</span> passed<span style="color: #7a0874; font-weight: bold;">&#41;</span>
0m9.781s</pre></div></div>

<p>If you have any problems you may want to clear the cache from safari.</p>
<p>I used the funfx gem from  <a href="http://funfx.rubyforge.org/">rubyforge</a> but it&#8217;s not up to date. If you want you can get the new code from <a href="http://github.com/peternic/funfx/tree/master">github</a>, it should have new features.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;submitHeadline=Flex+functional+testing+with+FunFx+and+Cucumber&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Flex+functional+testing+with+FunFx+and+Cucumber&amp;url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;T=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;title=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Flex+functional+testing+with+FunFx+and+Cucumber+@+http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/&amp;t=Flex+functional+testing+with+FunFx+and+Cucumber" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/08/20/flex-functional-testing-with-funfx-and-cucumber/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Hostname middleware for rails apps on multiple servers</title>
		<link>http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/</link>
		<comments>http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/#comments</comments>
		<pubDate>Sat, 15 Aug 2009 22:37:36 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=303</guid>
		<description><![CDATA[If you run a rails application on multiple servers behind a load balancer, almost every time you make a request you have a response from a different host. If you want to know which host has sent back the response, you can use a middleware that adds the hostname in the page title of each [...]]]></description>
			<content:encoded><![CDATA[<p>If you run a rails application on multiple servers behind a load balancer, almost every time you make a request you have a response from a different host. If you want to know which host has sent back the response, you can use a middleware that adds the hostname in the page title of each request.</p>
<p><strong>lib/hostname.rb</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Hostname  
  TITLE_REGEXP = <span style="color:#006600; font-weight:bold;">/</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>^<span style="color:#006600; font-weight:bold;">&lt;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;</span>\<span style="color:#006600; font-weight:bold;">/</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">/</span>i
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span>app, hostname=<span style="color:#996600;">&quot;&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@app</span>          = app
    <span style="color:#0066ff; font-weight:bold;">@title_suffix</span> = <span style="color:#996600;">&quot; - on #{hostname}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> call<span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    status, headers, response = <span style="color:#0066ff; font-weight:bold;">@app</span>.<span style="color:#9900CC;">call</span><span style="color:#006600; font-weight:bold;">&#40;</span>env<span style="color:#006600; font-weight:bold;">&#41;</span>
    add_hostname<span style="color:#006600; font-weight:bold;">&#40;</span>response, headers<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> headers<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Content-Type&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> =~ <span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">&#123;</span>text<span style="color:#006600; font-weight:bold;">/</span>html<span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#006600; font-weight:bold;">&#91;</span>status, headers, response<span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>  
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> add_hostname<span style="color:#006600; font-weight:bold;">&#40;</span>response, headers<span style="color:#006600; font-weight:bold;">&#41;</span>
    response.<span style="color:#9900CC;">each</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>s<span style="color:#006600; font-weight:bold;">|</span> s.<span style="color:#CC0066; font-weight:bold;">sub!</span><span style="color:#006600; font-weight:bold;">&#40;</span>TITLE_REGEXP, <span style="color:#996600;">&quot;<span style="color:#000099;">\\</span>1<span style="color:#000099;">\\</span>2#{@title_suffix}<span style="color:#000099;">\\</span>3&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">if</span> s =~ TITLE_REGEXP<span style="color:#006600; font-weight:bold;">&#125;</span>
    headers<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Content-Length&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#006600; font-weight:bold;">&#40;</span>headers<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;Content-Length&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">to_i</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#0066ff; font-weight:bold;">@title_suffix</span>.<span style="color:#9900CC;">length</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_s</span>
    <span style="color:#0000FF; font-weight:bold;">nil</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>To use it, add this line in your <strong>environment.rb</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">config.<span style="color:#9900CC;">middleware</span>.<span style="color:#9900CC;">use</span> <span style="color:#996600;">&quot;Hostname&quot;</span>, <span style="color:#006600; font-weight:bold;">%</span>x<span style="color:#996600;">&quot;hostname&quot;</span>.<span style="color:#CC0066; font-weight:bold;">chomp</span></pre></div></div>

<p>When you don&#8217;t need it anymore you can simply remove the line above.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;submitHeadline=Hostname+middleware+for+rails+apps+on+multiple+servers&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Hostname+middleware+for+rails+apps+on+multiple+servers&amp;url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;T=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;title=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Hostname+middleware+for+rails+apps+on+multiple+servers+@+http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/&amp;t=Hostname+middleware+for+rails+apps+on+multiple+servers" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/08/15/hostname-middleware-for-rails-apps-on-multiple-servers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Testing rails generators with Cucumber</title>
		<link>http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/</link>
		<comments>http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 13:43:59 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Cucumber]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=282</guid>
		<description><![CDATA[In the last days I switched a lot of old projects to use Cucumber, then I started writing test for Web App Theme. Here I haven&#8217;t models or controllers to test, because it&#8217;s just a generator, but I found enjoyable the use of plain text features to describe the ThemeGenerator behavior: Feature: Layout generation In [...]]]></description>
			<content:encoded><![CDATA[<p>In the last days I switched a lot of old projects to use <a href="http://cukes.info/" title="Cucumber">Cucumber</a>, then I started writing test for <a href="http://github.com/pilu/web-app-theme" title="Web App Theme">Web App Theme</a>. Here I haven&#8217;t models or controllers to test, because it&#8217;s just a generator, but I found enjoyable the use of plain text features to describe the <strong>ThemeGenerator</strong> behavior:</p>

<div class="wp_syntax"><div class="code"><pre class="cucumber" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">Feature</span>: Layout generation
  <span style="color:#9966CC; font-weight:bold;">In order</span> to create a great application
  I should be able to generate a layout with Web App Theme
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate a layout    
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no stylesheets
    <span style="color:#9966CC; font-weight:bold;">When</span> I generate a theme
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a layout named <span style="color:#996600;">&quot;application.html.erb&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a stylesheet named <span style="color:#996600;">&quot;web_app_theme.css&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a stylesheet named <span style="color:#996600;">&quot;web_app_theme_override.css&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a stylesheet named <span style="color:#996600;">&quot;themes/default/style.css&quot;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme admin</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate a layout with a name
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme with name <span style="color:#996600;">&quot;admin&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a layout named <span style="color:#996600;">&quot;admin.html.erb&quot;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --theme=&quot;drastic-dark&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate a layout choosing a theme
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no stylesheets
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme choosing the <span style="color:#996600;">&quot;drastic-dark&quot;</span> theme
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a stylesheet named <span style="color:#996600;">&quot;themes/drastic-dark/style.css&quot;</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --theme=bec --no_layout</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate only stylesheets without layout
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme without layout choosing the <span style="color:#996600;">&quot;bec&quot;</span> theme
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a stylesheet named <span style="color:#996600;">&quot;themes/bec/style.css&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">But</span> I should not have any layouts
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --app_name=&quot;My New Application&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate layout with application name
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme with application name <span style="color:#996600;">&quot;My New Application&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">Then</span> the layout <span style="color:#996600;">&quot;application.html.erb&quot;</span> should have <span style="color:#996600;">&quot;My New Application&quot;</span> as page title
&nbsp;
  <span style="color:#008000; font-style:italic;"># script/generate theme --type=sign</span>
  <span style="color:#9966CC; font-weight:bold;">Scenario</span>: Generate layout for signin <span style="color:#9966CC; font-weight:bold;">and</span> signup
    <span style="color:#9966CC; font-weight:bold;">Given</span> I have a new rails app
    <span style="color:#9966CC; font-weight:bold;">And</span> I have no layouts
    <span style="color:#9966CC; font-weight:bold;">And</span> I generate a theme for signin <span style="color:#9966CC; font-weight:bold;">and</span> signup
    <span style="color:#9966CC; font-weight:bold;">Then</span> I should have a layout named <span style="color:#996600;">&quot;sign.html.erb&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">And</span> I should have a layout named <span style="color:#996600;">&quot;sign.html.erb&quot;</span> with just a box</pre></div></div>

<p>Here my steps:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Given <span style="color:#006600; font-weight:bold;">/</span>^I have a new rails app$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  generate_rails_app
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I have no layouts$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  remove_layouts  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I have no stylesheets$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  remove_stylesheets
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span><span style="color:#006600; font-weight:bold;">&#41;</span>  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme with name <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, name<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme choosing the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> theme$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>theme_name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:theme</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> theme_name<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should have a layout named <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span>
  layout_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should have a stylesheet named <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>filename<span style="color:#006600; font-weight:bold;">|</span>
  stylesheet_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true    
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme without layout choosing the <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> theme$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>theme_name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:theme</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> theme_name, <span style="color:#ff3333; font-weight:bold;">:no_layout</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should <span style="color:#9966CC; font-weight:bold;">not</span> have any layouts$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  layouts_count.<span style="color:#9900CC;">should</span> == <span style="color:#006666;">0</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme with application name <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span>$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>name<span style="color:#006600; font-weight:bold;">|</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:app_name</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> name <span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^the layout <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> should have <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> as page title$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>layout, title<span style="color:#006600; font-weight:bold;">|</span>
  layout_title<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> == title
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Given <span style="color:#006600; font-weight:bold;">/</span>^I generate a theme <span style="color:#9966CC; font-weight:bold;">for</span> signin <span style="color:#9966CC; font-weight:bold;">and</span> signup$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:theme</span>, <span style="color:#ff3333; font-weight:bold;">:layout_type</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:sign</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">Then</span> <span style="color:#006600; font-weight:bold;">/</span>^I should have a layout named <span style="color:#996600;">&quot;([^<span style="color:#000099;">\&quot;</span>]*)&quot;</span> with just a box$<span style="color:#006600; font-weight:bold;">/</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>layout<span style="color:#006600; font-weight:bold;">|</span>
  layout_with_box?<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Basically I create a temp folder that I use as fake rails root, and there I launch the generator.  After each feature I remove that folder.</p>
<p>And here my <strong>env.rb</strong></p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">$:.<span style="color:#9900CC;">unshift</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">&quot;/../../rails_generators&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rubygems&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;rails_generator&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rails_generator/scripts/generate'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;fileutils&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;theme/theme_generator&quot;</span>
&nbsp;
web_app_theme_root  = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;/../../&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
tmp_rails_app_name  = <span style="color:#996600;">&quot;tmp_rails_app&quot;</span>
tmp_rails_app_root  = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>web_app_theme_root, tmp_rails_app_name<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">Rails::<span style="color:#CC00FF; font-weight:bold;">Generator</span>::Base</span>.<span style="color:#9900CC;">append_sources</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#6666ff; font-weight:bold;">Rails::<span style="color:#CC00FF; font-weight:bold;">Generator</span>::PathSource</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:plugin</span>, <span style="color:#996600;">&quot;#{web_app_theme_root}/rails_generators/&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> GeneratorHelpers
  <span style="color:#9966CC; font-weight:bold;">def</span> generate_rails_app
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">mkdir</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>    
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> remove_layouts
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">rm_rf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> remove_stylesheets
    <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">rm_rf</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;public&quot;</span>, <span style="color:#996600;">&quot;stylesheets&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> generate_layout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
    options = !args.<span style="color:#9900CC;">empty</span>? <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> args.<span style="color:#9900CC;">last</span>.<span style="color:#9900CC;">is_a</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">Hash</span><span style="color:#006600; font-weight:bold;">&#41;</span> ? args.<span style="color:#9900CC;">pop</span> : <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
    options.<span style="color:#9900CC;">merge</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:destination <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@app_root</span>, <span style="color:#ff3333; font-weight:bold;">:quiet</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>    
    <span style="color:#6666ff; font-weight:bold;">Rails::<span style="color:#CC00FF; font-weight:bold;">Generator</span>::Scripts::Generate</span>.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">run</span><span style="color:#006600; font-weight:bold;">&#40;</span>args, options<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layouts_count
    <span style="color:#CC00FF; font-weight:bold;">Dir</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, <span style="color:#996600;">&quot;**&quot;</span>, <span style="color:#996600;">&quot;*.erb&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">size</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layout_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exists</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, filename<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> stylesheet_exists?<span style="color:#006600; font-weight:bold;">&#40;</span>relative_path<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">exists</span>?<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;public&quot;</span>, <span style="color:#996600;">&quot;stylesheets&quot;</span>, relative_path<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">should</span> be_true
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layout_title<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, layout<span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;r&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">read</span>.<span style="color:#9900CC;">match</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">/&lt;</span>title<span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span>^<span style="color:#006600; font-weight:bold;">&lt;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">*</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&lt;</span>\<span style="color:#006600; font-weight:bold;">/</span>title<span style="color:#006600; font-weight:bold;">&gt;/</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> layout_with_box?<span style="color:#006600; font-weight:bold;">&#40;</span>layout<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>@app_root, <span style="color:#996600;">&quot;app&quot;</span>, <span style="color:#996600;">&quot;views&quot;</span>, <span style="color:#996600;">&quot;layouts&quot;</span>, layout<span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;r&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">read</span> =~ <span style="color:#006600; font-weight:bold;">%</span>r<span style="color:#006600; font-weight:bold;">|&lt;</span>div id=<span style="color:#996600;">&quot;box&quot;</span><span style="color:#006600; font-weight:bold;">&gt;|</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
Before <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#0066ff; font-weight:bold;">@app_root</span> = tmp_rails_app_root  
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
After <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#CC00FF; font-weight:bold;">FileUtils</span>.<span style="color:#9900CC;">rm_rf</span><span style="color:#006600; font-weight:bold;">&#40;</span>tmp_rails_app_root<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
World<span style="color:#006600; font-weight:bold;">&#40;</span>GeneratorHelpers<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;submitHeadline=Testing+rails+generators+with+Cucumber&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Testing+rails+generators+with+Cucumber&amp;url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;T=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;title=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Testing+rails+generators+with+Cucumber+@+http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/&amp;t=Testing+rails+generators+with+Cucumber" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/08/11/testing-rails-generators-with-cucumber/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>2 minutes admin layout with rails and the web-app-theme generator</title>
		<link>http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/</link>
		<comments>http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/#comments</comments>
		<pubDate>Thu, 30 Jul 2009 14:02:19 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=257</guid>
		<description><![CDATA[Many people found out a rails generator inside my web-app-theme project and asked me how to use it. Here an example, starting from scratch with a new rails app that manages music Albums. rails cool_albums cd cool_albums script/generate scaffold Album name:string artist:string date:date rake db:migrate After creating the first controller with a scaffold or with [...]]]></description>
			<content:encoded><![CDATA[<p>
Many people found out a rails generator inside my <a href="http://github.com/pilu/web-app-theme">web-app-theme</a> project and asked me how to use it.<br />
Here an example, starting from scratch with a new rails app that manages music Albums.
</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">rails cool_albums
<span style="color: #7a0874; font-weight: bold;">cd</span> cool_albums
script<span style="color: #000000; font-weight: bold;">/</span>generate scaffold Album name:string artist:string <span style="color: #c20cb9; font-weight: bold;">date</span>:<span style="color: #c20cb9; font-weight: bold;">date</span>
rake db:migrate</pre></div></div>

<p>After creating the first controller with a scaffold or with your hands, start creating a theme:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script<span style="color: #000000; font-weight: bold;">/</span>plugin <span style="color: #c20cb9; font-weight: bold;">install</span> git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>pilu<span style="color: #000000; font-weight: bold;">/</span>web-app-theme.git
script<span style="color: #000000; font-weight: bold;">/</span>generate theme application --app_name=<span style="color: #ff0000;">&quot;My Cool Albums&quot;</span> <span style="color: #660033;">--theme</span>=<span style="color: #ff0000;">&quot;drastic-dark&quot;</span></pre></div></div>

<p>The first argument (&#8220;application&#8221;) is the name of the layout that the generator will create (application.html.erb).<br />
The <strong>&#8211;app_name</strong> option specifies the name used as page title, and with the <strong>&#8211;theme</strong> specifies which theme to use among all the <a href="http://pilu.github.com/web-app-theme/" title="Web App Theme Demo">available themes</a> inside the plugin.
</p>
<p>Now remove the default index.html created by rails and the layout created by the scaffold:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">rm</span> app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>layouts<span style="color: #000000; font-weight: bold;">/</span>albums.html.erb 
<span style="color: #c20cb9; font-weight: bold;">rm</span> public<span style="color: #000000; font-weight: bold;">/</span>index.html</pre></div></div>

<p>Add the following line in your <strong>routes.rb</strong> to set the default page of the application:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">map.root :controller =<span style="color: #000000; font-weight: bold;">&gt;</span> :albums</pre></div></div>

<p>Start the server</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script<span style="color: #000000; font-weight: bold;">/</span>server</pre></div></div>

<p><img src="/wp-content/uploads/2009/07/web-app-theme-example-1.jpg" /></p>
<p>Ok, the layout has been successfully created, but we need to apply a theme for each one of the views generated by the scaffold.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">script<span style="color: #000000; font-weight: bold;">/</span>generate themed albums album <span style="color: #660033;">--layout</span>=application --with_will_paginate</pre></div></div>

<p>
With the first 2 arguments I specified the controller path (albums) and the model used (album).<br />
The <strong>&#8211;layout</strong> options is used by the <strong>themed</strong> generator to know where to add the <strong>Albums</strong> menu link.
</p>
<p>
Since we want to use will paginate (we set the <strong>&#8211;with_will_paginate</strong> option), we need to change one line in our albums controller from:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@albums</span> = Album.<span style="color:#9900CC;">all</span></pre></div></div>

<p>to:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@albums</span> = Album.<span style="color:#9900CC;">paginate</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:per_page</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">10</span>, <span style="color:#ff3333; font-weight:bold;">:page</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> params<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Here a trick to show form error messages inside the auto generated forms, you can add the following lines in your <strong>environment.rb</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActionView::Base</span>.<span style="color:#9900CC;">field_error_proc</span> = <span style="color:#CC0066; font-weight:bold;">Proc</span>.<span style="color:#9900CC;">new</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>html_tag, instance<span style="color:#006600; font-weight:bold;">|</span> 
  <span style="color:#9966CC; font-weight:bold;">if</span> html_tag =~ <span style="color:#006600; font-weight:bold;">/&lt;</span>label<span style="color:#006600; font-weight:bold;">/</span>
    <span style="color:#006600; font-weight:bold;">%|&lt;</span>div <span style="color:#9966CC; font-weight:bold;">class</span>=<span style="color:#996600;">&quot;fieldWithErrors&quot;</span><span style="color:#006600; font-weight:bold;">&gt;</span><span style="color:#008000; font-style:italic;">#{html_tag} &lt;span class=&quot;error&quot;&gt;#{[instance.error_message].join(', ')}&lt;/span&gt;&lt;/div&gt;|</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    html_tag
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Ok, restart your server and you are done.</p>
<p><img src="/wp-content/uploads/2009/07/web-app-theme-example-2.jpg" /></p>
<p>Feel free to fork the project from <a href="http://github.com/pilu/web-app-theme/tree/master">github</a> to improve the generator or to add a new theme.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;submitHeadline=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator&amp;url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;T=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;title=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator+@+http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/&amp;t=2+minutes+admin+layout+with+rails+and+the+web-app-theme+generator" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/07/30/2-minutes-admin-layout-with-rails-and-the-web-app-theme-generator/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>Terror the micro aggregator</title>
		<link>http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/</link>
		<comments>http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/#comments</comments>
		<pubDate>Tue, 17 Mar 2009 15:55:54 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=120</guid>
		<description><![CDATA[Terror is a micro feed aggregator made with sinatra and bundled as a gem. It&#8217;s very simple to use, just install the gem: gem sources -a http://gems.github.com sudo gem install pilu-terror Create a new project terror new_aggregator_name cd new_aggregator_name Start the server thin start -C config/thin.yml Run the feeds fetcher rake feeds:fetch # run it [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://github.com/pilu/terror/tree/master" title="Terror the micro feed aggregator">Terror</a> is a micro feed aggregator made with <a href="http://www.sinatrarb.com/" title="Sinatra">sinatra</a> and bundled as a gem. It&#8217;s very simple to use, just install the gem:
</p>
<pre><code>gem sources -a http://gems.github.com
sudo gem install pilu-terror
</code></pre>
<p>Create a new project</p>
<pre><code>terror new_aggregator_name
cd new_aggregator_name </code></pre>
<p>Start the server</p>
<pre><code>thin start -C config/thin.yml</code></pre>
<p>Run the feeds fetcher</p>
<pre><code>rake feeds:fetch # run it as a cron job</code></pre>
<p>You can browse the source and fork it on <a href="http://github.com/pilu/terror/tree/master" title="Terror the micro feed aggregator">github</a>.
</p>
<p>
<img src="http://gravityblast.com/wp-content/uploads/2009/03/terror.jpg" alt="" title="terror" width="500" height="591" class="alignnone size-full wp-image-123" /></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;submitHeadline=Terror+the+micro+aggregator&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Terror+the+micro+aggregator&amp;url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;T=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;title=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Terror+the+micro+aggregator+@+http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/&amp;t=Terror+the+micro+aggregator" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/03/17/terror-the-micro-aggregator/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Radiant Gallery on Dreamhost with Ruby 1.8.7</title>
		<link>http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/</link>
		<comments>http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/#comments</comments>
		<pubDate>Thu, 15 Jan 2009 15:49:11 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Gor]]></category>
		<category><![CDATA[Radiant]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[dreamhost]]></category>
		<category><![CDATA[gallery]]></category>

		<guid isPermaLink="false">http://gravityblast.com/?p=80</guid>
		<description><![CDATA[Some people in the past had problems using the Gallery extension on Dreamhost. I didn&#8217;t try Dreamhost but someone from the Radiant list solved that problem following these instructions. Check it out if you are on Dreamhost too. share]]></description>
			<content:encoded><![CDATA[<p>Some people in the past had problems using the <a href="http://github.com/pilu/radiant-gallery/tree/master">Gallery extension</a> on <a href="http://www.dreamhost.com/">Dreamhost</a>. I didn&#8217;t try Dreamhost but someone from the Radiant list solved that problem following <a href="http://www.dreamhoststatus.com/2009/01/02/ruby-187-upgrades/#comments">these instructions</a>. Check it out if you are on Dreamhost too.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;submitHeadline=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7&amp;url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;T=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;title=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7+@+http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/&amp;t=Radiant+Gallery+on+Dreamhost+with+Ruby+1.8.7" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2009/01/15/radiant-gallery-on-dreamhost-with-ruby-187/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Getting Exif data using ImageScience</title>
		<link>http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/</link>
		<comments>http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/#comments</comments>
		<pubDate>Fri, 02 May 2008 09:39:54 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Exif]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/</guid>
		<description><![CDATA[In my current rails project I need to upload photos and save some exif data taken from them. I use attachment_fu as uploading system that let me choose which image processor to use. Using rmagick and mini_magick I can extract exif data with the following code: # rmagick image = Magick::ImageList.new&#40;filename&#41;.first puts image&#91;'EXIF:Model'&#93; # The [...]]]></description>
			<content:encoded><![CDATA[<p>In my current <a href="http://www.rubyonrails.org/" title="Ruby on Rails">rails</a> project I need to upload photos and save some exif data taken from them. I use <a href="http://github.com/technoweenie/attachment_fu/">attachment_fu</a> as uploading system that let me choose which image processor to use. Using rmagick and mini_magick I can extract exif data with the following code:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;"># rmagick</span>
image = <span style="color:#6666ff; font-weight:bold;">Magick::ImageList</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> image<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'EXIF:Model'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#008000; font-style:italic;"># The camera model used to take the picture</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># mini_magick</span>
image = <span style="color:#6666ff; font-weight:bold;">MiniMagick::Image</span>.<span style="color:#9900CC;">from_file</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> image<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;EXIF:Model&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></div></div>

<p>The problem is that I can&#8217;t do the same thing with <a href="http://seattlerb.rubyforge.org/ImageScience.html" title="ImageScience">image_science</a>, because it has no methods that return exif data, so I want to add a method to the ImageScience class to do that.<br />
Looking the <a href="http://freeimage.sourceforge.net/">FreeImage</a> <a href="http://freeimage.sourceforge.net/fip/index.html">documentation</a> I found some helpful functions, FreeImage_GetMetadata and FreeImage_TagToString. With these 2 functions I&#8217;m able to get an exif tag and convert it to a readable string. Each one of the available tags belongs to one of the following meta models:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">FI_ENUM<span style="color: #009900;">&#40;</span>FREE_IMAGE_MDMODEL<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  FIMD_NODATA         <span style="color: #339933;">=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>
  FIMD_COMMENTS       <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// single comment or keywords</span>
  FIMD_EXIF_MAIN      <span style="color: #339933;">=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif-TIFF metadata</span>
  FIMD_EXIF_EXIF      <span style="color: #339933;">=</span> <span style="color: #0000dd;">2</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif-specific metadata</span>
  FIMD_EXIF_GPS       <span style="color: #339933;">=</span> <span style="color: #0000dd;">3</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif GPS metadata</span>
  FIMD_EXIF_MAKERNOTE <span style="color: #339933;">=</span> <span style="color: #0000dd;">4</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif maker note metadata</span>
  FIMD_EXIF_INTEROP   <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Exif interoperability metadata</span>
  FIMD_IPTC           <span style="color: #339933;">=</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// IPTC/NAA metadata</span>
  FIMD_XMP            <span style="color: #339933;">=</span> <span style="color: #0000dd;">7</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Abobe XMP metadata</span>
  FIMD_GEOTIFF        <span style="color: #339933;">=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// GeoTIFF metadata</span>
  FIMD_ANIMATION      <span style="color: #339933;">=</span> <span style="color: #0000dd;">9</span><span style="color: #339933;">,</span>	<span style="color: #666666; font-style: italic;">// Animation metadata</span>
  FIMD_CUSTOM         <span style="color: #339933;">=</span> <span style="color: #0000dd;">10</span>	<span style="color: #666666; font-style: italic;">// Used to attach other metadata types to a dib</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Ok, now I can extract the model of the camera:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">FreeImage_GetMetadata<span style="color: #009900;">&#40;</span>FIMD_EXIF_MAIN<span style="color: #339933;">,</span> bitmap<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Model&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>tag<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span>FreeImage_TagToString<span style="color: #009900;">&#40;</span>FIMD_EXIF_MAIN<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>As you can see, I need to pass the model of the &#8220;Model&#8221; tag. But if I don&#8217;t know which model to use, I can loop through all of them until the returned value of the <strong>FreeImage_GetMetadata</strong> function is not NULL:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>model <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> model <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">11</span><span style="color: #339933;">;</span> model<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span>FreeImage_GetMetadata<span style="color: #009900;">&#40;</span>model<span style="color: #339933;">,</span> bitmap<span style="color: #339933;">,</span> tagName<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>tag<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #b1b100;">return</span> rb_str_new2<span style="color: #009900;">&#40;</span>FreeImage_TagToString<span style="color: #009900;">&#40;</span>model<span style="color: #339933;">,</span> tag<span style="color: #339933;">,</span> <span style="color: #000000; font-weight: bold;">NULL</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Finally I can write a ruby module that extends ImageScience and adds the ability to get an exif tag:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> ImageScienceExifData
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#40;</span>key<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> key =~ <span style="color:#006600; font-weight:bold;">/</span>^EXIF:<span style="color:#006600; font-weight:bold;">&#40;</span>\w<span style="color:#006600; font-weight:bold;">+</span><span style="color:#006600; font-weight:bold;">&#41;</span>?<span style="color:#006600; font-weight:bold;">/</span>    
      get_exif<span style="color:#006600; font-weight:bold;">&#40;</span>$<span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  inline <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>builder<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> test ?d, <span style="color:#996600;">&quot;/opt/local&quot;</span> <span style="color:#9966CC; font-weight:bold;">then</span>
      builder.<span style="color:#9900CC;">add_compile_flags</span> <span style="color:#996600;">&quot;-I/opt/local/include&quot;</span>
      builder.<span style="color:#9900CC;">add_link_flags</span> <span style="color:#996600;">&quot;-L/opt/local/lib&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    builder.<span style="color:#9900CC;">add_link_flags</span> <span style="color:#996600;">&quot;-lfreeimage&quot;</span>
    builder.<span style="color:#9900CC;">add_link_flags</span> <span style="color:#996600;">&quot;-lstdc++&quot;</span> <span style="color:#008000; font-style:italic;"># only needed on PPC for some reason. lame</span>
    builder.<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#996600;">'&quot;FreeImage.h&quot;'</span>
&nbsp;
    builder.<span style="color:#9900CC;">prefix</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span><span style="color:#996600;">&quot;END&quot;</span>
      <span style="color:#008000; font-style:italic;">#define GET_BITMAP(name) FIBITMAP *(name); Data_Get_Struct(self, FIBITMAP, (name)); if (!(name)) rb_raise(rb_eTypeError, &quot;Bitmap has already been freed&quot;)</span>
    <span style="color:#9966CC; font-weight:bold;">END</span>
&nbsp;
    builder.<span style="color:#9900CC;">c</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span><span style="color:#996600;">&quot;END&quot;</span>
      VALUE get_exif<span style="color:#006600; font-weight:bold;">&#40;</span>char <span style="color:#006600; font-weight:bold;">*</span>tagName<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
        GET_BITMAP<span style="color:#006600; font-weight:bold;">&#40;</span>bitmap<span style="color:#006600; font-weight:bold;">&#41;</span>;
        FITAG <span style="color:#006600; font-weight:bold;">*</span>tag = NULL;
        const char <span style="color:#006600; font-weight:bold;">*</span>value;
        int model;
&nbsp;
        <span style="color:#9966CC; font-weight:bold;">for</span><span style="color:#006600; font-weight:bold;">&#40;</span>model = <span style="color:#006666;">0</span>; model <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#006666;">11</span>; model<span style="color:#006600; font-weight:bold;">++</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
          <span style="color:#9966CC; font-weight:bold;">if</span><span style="color:#006600; font-weight:bold;">&#40;</span>FreeImage_GetMetadata<span style="color:#006600; font-weight:bold;">&#40;</span>model, bitmap, tagName, <span style="color:#006600; font-weight:bold;">&amp;</span>tag<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
            <span style="color:#0000FF; font-weight:bold;">return</span> rb_str_new2<span style="color:#006600; font-weight:bold;">&#40;</span>FreeImage_TagToString<span style="color:#006600; font-weight:bold;">&#40;</span>model, tag, NULL<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>;
        <span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
        <span style="color:#0000FF; font-weight:bold;">return</span> Qnil;
      <span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">END</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
ImageScience.<span style="color:#9900CC;">send</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:include</span>, ImageScienceExifData<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
ImageScience.<span style="color:#9900CC;">with_image</span><span style="color:#006600; font-weight:bold;">&#40;</span>filename<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>img<span style="color:#006600; font-weight:bold;">|</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> img<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;EXIF:Model&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>The output with the picture I used is the following :</p>
<pre>NIKON
COOLPIX S3
2006:12:10 12:09:17</pre>
<p>It doesn&#8217;t work with all the exif names but for now it&#8217;s ok for my needs. The next step is to add the code above in my rails application and use it with attachment_fu. I&#8217;ll write another post about that soon.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;submitHeadline=Getting+Exif+data+using+ImageScience&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Getting+Exif+data+using+ImageScience&amp;url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;T=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;title=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Getting+Exif+data+using+ImageScience+@+http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/&amp;t=Getting+Exif+data+using+ImageScience" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2008/05/02/getting-exif-data-using-imagescience/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Radiant Newsletter extension has stats</title>
		<link>http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/</link>
		<comments>http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/#comments</comments>
		<pubDate>Thu, 27 Mar 2008 21:53:04 +0000</pubDate>
		<dc:creator>Andrea Franz</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Radiant]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/</guid>
		<description><![CDATA[Some weeks ago Casper Fabricius sent me a patch for the Radiant Newsletter extension. He added a statistics system to track how many times sent emails are opened. I have finally found the time to apply it and make a commit to my repository. Thank you very very much for your work Casper! I&#8217;ll write [...]]]></description>
			<content:encoded><![CDATA[<p>Some weeks ago <a href="http://casperfabricius.com/blog/">Casper Fabricius</a> sent me a patch for the <a href="http://gravityblast.com/projects/radiant-newsletter-extension/">Radiant Newsletter extension.</a> He added a statistics system to track how many times sent emails are opened. I have finally found the time to apply it and make a commit to my repository. Thank you very very much for your work Casper! I&#8217;ll write an article about this extension as soon as possible.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a><strong><em>share</em></strong></a>
<br />
<div class="d">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;submitHeadline=Radiant+Newsletter+extension+has+stats&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.dzone.com/links/add.html?description=Radiant+Newsletter+extension+has+stats&amp;url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;DZone"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/dzone.png" title="Add to&nbsp;DZone" alt="Add to&nbsp;DZone" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;T=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://slashdot.org/bookmark.pl?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Slashdot"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/slashdot.png" title="Add to&nbsp;Slashdot" alt="Add to&nbsp;Slashdot" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit.php?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;title=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Radiant+Newsletter+extension+has+stats+@+http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/&amp;t=Radiant+Newsletter+extension+has+stats" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://gravityblast.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
</div>
</div>
<!-- Social Bookmarks END -->
]]></content:encoded>
			<wfw:commentRss>http://gravityblast.com/2008/03/27/radiant-newsletter-extension-has-stats/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>

