<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Rails Inside</title>
	
	<link>http://www.railsinside.com</link>
	<description>Daily Rails news, views, tips, and joy</description>
	<lastBuildDate>Wed, 27 Oct 2010 00:21:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/RailsInside" /><feedburner:info uri="railsinside" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>RailsInside</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>How To Score Your Rails App's Complexity Before Refactoring</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/z4fC_FP7lys/487-how-to-score-your-rails-apps-complexity-before-refactoring.html</link>
		<comments>http://www.railsinside.com/tutorials/487-how-to-score-your-rails-apps-complexity-before-refactoring.html#comments</comments>
		<pubDate>Wed, 27 Oct 2010 00:18:16 +0000</pubDate>
		<dc:creator>Eric Davis</dc:creator>
				<category><![CDATA[Tutorials]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/?p=487</guid>
		<description><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/10/Screen-shot-2010-10-27-at-1.20.13-AM.png" alt="Screen shot 2010-10-27 at 1.20.13 AM" title="Screen shot 2010-10-27 at 1.20.13 AM" width="80" style="float: left; margin-right: 12px; margin-bottom: 12px; border: 1px solid #333" />Every Rails developer must refactor their Rails code at some time. Ruby's dynamic nature makes it difficult for generic tools to understand what Ruby is doing though. Once you add Rails macros and metaprogramming into the mix you really need&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/10/Screen-shot-2010-10-27-at-1.20.13-AM.png" alt="Screen shot 2010-10-27 at 1.20.13 AM" title="Screen shot 2010-10-27 at 1.20.13 AM" width="80" style="float: left; margin-right: 12px; margin-bottom: 12px; border: 1px solid #333" />Every Rails developer must refactor their Rails code at some time. Ruby's dynamic nature makes it difficult for generic tools to understand what Ruby is doing though. Once you add Rails macros and metaprogramming into the mix you really need specialized tools when refactoring Ruby. In my last post I wrote about how to a generic tool called <a href="http://www.railsinside.com/uncategorized/460-the-first-step-of-refactoring-a-rails-application.html"><code>wc</code> to find the complex code that needs to be refactored</a>. <code>wc</code>'s has many problems when checking Ruby code though:</p>
<ul>
<li>it counts blank and empty lines</li>
<li>it counts lines with only comments</li>
<li>it counts only the number of lines, so each of these lines count as one even though the second is much more complex.</li>
</ul>
<pre><code>post = Post.new
elsif (parsing_descr == 1 || parsing_descr == 2) &amp;&amp; line =~ /^:\d+\s+\d+\s+[0-9a-f.]+\s+[0-9a-f.]+\s+(\w)\d+\s+(\S+)\t(.+)$/</code></pre>
<p>To overcome <code>wc</code>'s limitations, we need to use a tool that is built specifically for evaluating the complexity of Ruby code.</p>
<h3 id="flog">Flog</h3>
<p><a href="http://ruby.sadi.st/Flog.html">Flog</a> is a tool by Ryan Davis and Seattle.rb that scores your Ruby code based on common patterns. It works based on counting your code's ABCs:</p>
<ul>
<li>A - Assignments. When more objects are assigned, the complexity goes up - <code>foo = 1 + 1</code>.</li>
<li>B - Branches. When code branches, there are multiple paths that it might follow. This also increases it's complexity.</li>
<li>C - Calls. When code calls other code, the complexity increases because they caller and callee are now connected. A call is both a method call or other action like <code>eval</code> or <code>puts</code>.</li>
</ul>
<p>All code has assignments, branches, and calls. Flog's job is to check that they aren't used excessively or abused.</p>
<p>Each of the ABCs have different metrics associated with them. For example, a standard method call might only score .2, but an <code>eval</code> call would score 5 even though they are both calls. This is so the more complex and difficult to understand code is scored higher.</p>
<p>Now that you understand how scoring works, lets take a look at how flog uses the scoring.</p>
<h3 id="flog_scoring">Flog Scoring</h3>
<p>When flog is given Ruby code, flog parses it and builds up a structure of the code internally using <a href="http://parsetree.rubyforge.org/">RubyParser</a>. Then it goes through every class and method until everything is scored. What you end up with is a breakdown of how each class and method scored. So if you had two branches (1 point each) in your method, flog would give that method a score of 2. At the class level, flog would give your class a score that is a total of all of the methods in the class.</p>
<p>Using the scoring, you can get an idea of how complex or poorly written a piece of code is compared to other code. For example: in a class with two methods, one with a score of 40 and one with a score of 140, it's easy to see that the second method is more complex (or over complicating things). Ideally you would devote more of your time to refactor on the second method, since it's more complex.</p>
<p>A complete listing of the different scores that flog assigned can be found here in the <a href="http://github.com/seattlerb/flog/blob/master/lib/flog.rb#L13-67">source code</a> but here is a summary of the common ones:</p>
<ul>
<li>Class defination - 1</li>
<li>Method defination - 0</li>
<li>Module defination - 0</li>
<li>Subclass defination - 0.5</li>
<li>method call - 0.2</li>
<li>assignments - 1</li>
<li>branching (<code>and</code>, <code>case</code>, <code>else</code>, <code>if</code>, <code>or</code>, <code>rescue</code>, <code>until</code>, <code>when</code>, <code>while</code>) - 1</li>
<li>litteral number - 0.25</li>
<li>Symbol to Proc (e.g. <code>posts.collect(&amp;:author)</code>) - 10</li>
<li><code>alias_method</code> - 2</li>
<li><code>alias</code> - 2</li>
<li><code>block_pass</code> - 1</li>
<li><code>block</code> - 1</li>
<li><code>class_eval</code> - 5</li>
<li><code>define_method</code> - 5</li>
<li><code>eval</code> - 5</li>
<li><code>extend</code> - 2</li>
<li><code>include</code> - 2</li>
<li><code>inject</code> - 2</li>
<li><code>instance_eval</code> - 5</li>
<li><code>instance_method</code> - 2</li>
<li><code>instance_methods</code> - 2</li>
<li><code>method_added</code> - 2</li>
<li><code>method_defined?</code> - 2</li>
<li><code>method_removed</code> - 2</li>
<li><code>method_undefined</code> - 2</li>
<li><code>module_eval</code> - 5</li>
<li><code>private_class_method</code> - 2</li>
<li><code>private_instance_methods</code> - 2</li>
<li><code>private_method_defined?</code> - 2</li>
<li><code>protected_instance_methods</code> - 2</li>
<li><code>protected_method_defined?</code> - 2</li>
<li><code>public_class_method</code> - 2</li>
<li><code>public_instance_methods</code> - 2</li>
<li><code>public_method_defined?</code> - 2</li>
<li><code>remove_method</code> - 2</li>
<li><code>send</code> - 3</li>
<li><code>super</code> - 1</li>
<li><code>undef_method</code> - 2</li>
<li><code>yield</code> - 1</li>
</ul>
<p>A good rule of thumb for Flog scores is that you will want to eventually refactor or at least think about refactoring any method when it has a score of 40 or more. I have seen a single method go as high as 1,100 before (don't ask).</p>
<h3 id="refactoring_based_on_flog8217s_score">Refactoring based on flog's score</h3>
<p>Once you have found which methods and classes that score high, you should be ready to refactor them. Since flog scores are totals of all of the assignments, branches, and calls; using a refactoring method that splits a section of code in two is usually a good first refactoring to perform. For a high scoring class, you might want to use:</p>
<ul>
<li><a href="http://www.refactoring.com/catalog/extractClass.html">extract class</a></li>
<li><a href="http://www.refactoring.com/catalog/extractSuperclass.html">extract superclass</a></li>
<li><a href="http://www.refactoring.com/catalog/extractSubclass.html">extract subclass</a></li>
<li><a href="http://www.refactoring.com/catalog/moveMethod.html">move method</a></li>
<li><a href="http://www.refactoring.com/catalog/moveField.html">move field</a></li>
<li><a href="http://www.refactoring.com/catalog/removeMiddleMan.html">remove middle man</a></li>
<li><a href="http://sourcemaking.com/refactoring/extract-hierarchy">extract hierarchy</a></li>
</ul>
<p>When refactoring a high scoring, you might use:</p>
<ul>
<li><a href="http://www.refactoring.com/catalog/extractMethod.html">extract method</a></li>
<li><a href="http://www.refactoring.com/catalog/moveMethod.html">move method</a> - especially if the method is being too intimate with another class</li>
<li><a href="http://www.refactoring.com/catalog/moveField.html">move field</a></li>
<li><a href="http://www.refactoring.com/catalog/encapsulateField.html">encapsulate field</a></li>
<li><a href="http://www.refactoring.com/catalog/decomposeConditional.html">decompose conditional</a></li>
<li><a href="http://www.refactoring.com/catalog/consolidateConditionalExpression.html">consolidate conditional expression</a></li>
<li><a href="http://www.refactoring.com/catalog/replaceNestedConditionalWithGuardClauses.html">remove nested conditional with guard clauses</a></li>
<li><a href="http://www.refactoring.com/catalog/replaceTempWithQuery.html">replace temp with query</a></li>
<li><a href="http://www.refactoring.com/catalog/replaceMethodWithMethodObject.html">replace method with method object</a></li>
<li><a href="http://www.refactoring.com/catalog/substituteAlgorithm.html">substitute algorithm</a></li>
</ul>
<p>My personal favorite refactoring is <a href="http://www.refactoring.com/catalog/extractMethod.html">extract method</a>. I use this all the time so split up larger methods into smaller one. It doesn't affect the <em>total</em> flog score for the project, but it makes the code a lot easier to understand when it's in two small methods. Do this enough and eventually you start to see some duplication across classes and you can make some really great refactorings then.</p>
<h3 id="getting_started_with_flog">Getting started with flog</h3>
<p>To get started with flog right away in your Rails app; I'd recommend that you install the <a href="http://metric-fu.rubyforge.org/">metric_fu</a> gem and run it's reports. metric_fu includes flog and several other tools I'm going to cover over the next few posts. Be warned, metric_fu can take a few minutes to run it's reports, especially on larger projects since it runs the entire test suite.</p>
<p>If you aren't using Rails or don't want to wait for the entire metric_fu report suite to run, you can get started using flog with:</p>
<ol>
<li>gem install flog</li>
<li>flog path/to/app</li>
</ol>
<p>This will find every Ruby file you have and will run flog on each file. Since flog produces a lot of output, I'd recommend piping this to a file so you can read through it all yourself (<code>flog path/to/app &gt; flog_output.txt</code>). Running flog like this is quick so feel free to experiment with a few of it's command line options. The options I like to use when refactoring are:</p>
<ul>
<li>-a (—all) will display all of the flog results. Typically flog only shows the top 60% worst code.</li>
<li>-d (—details) shows the scoring details so you can see why the code is scoring so high.</li>
<li>-g (—group) groups the results by classes. If you are still exploring your application to find out what areas need to be refactored, the group option can help you explore faster (especially with the -a option)</li>
</ul>
<p>Another option I use outside of refactoring is the —score option. The score will show a project score of all of the files and also the average score per method. This is great data to save if you want to watch the project's score over the long term (e.g. is the score getting better or worse?). If you use metric_fu, this value is graphed each time you run the metrics task so hopefully you can start to see the flog score get lower and lower over time.</p>
<p>Refactoring the most complex code in your application is a good strategy to keep it healthy and easy to change. But that alone isn't enough, especially when there is a lot of code duplication. Luckily Ruby has a tool that can be used to detect code duplication, flay. I'll be digging into how flay can be used in your project to find where your duplication is hiding.</p>
<p style="padding: 8px; background-color: #eee"><img src="http://gravatar.com/avatar/ae959c6836366656b895069d75ad09bf?size=64" alt="Eric Davis" style="float: left; margin-right: 12px; margin-bottom: 12px"><strong>This is a guest post by Eric Davis.</strong>  Eric is a member of the Redmine team and has written an ebook <a href="http://www.refactoringredmine.com/">Refactoring Redmine</a> to show Rails developers what refactoring real Rails code looks like.  He writes about the different refactorings done to Redmine every day at <a href="http://theadmin.org">http://theadmin.org</a>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=How+To+Score+Your+Rails+App%26%23039%3Bs+Complexity+Before+Refactoring+http://www.railsinside.com/?p=487" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=How+To+Score+Your+Rails+App%26%23039%3Bs+Complexity+Before+Refactoring+http://www.railsinside.com/?p=487" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=z4fC_FP7lys:-J_O0tExyn4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=z4fC_FP7lys:-J_O0tExyn4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=z4fC_FP7lys:-J_O0tExyn4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=z4fC_FP7lys:-J_O0tExyn4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=z4fC_FP7lys:-J_O0tExyn4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=z4fC_FP7lys:-J_O0tExyn4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=z4fC_FP7lys:-J_O0tExyn4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=z4fC_FP7lys:-J_O0tExyn4:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=z4fC_FP7lys:-J_O0tExyn4:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/z4fC_FP7lys" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/tutorials/487-how-to-score-your-rails-apps-complexity-before-refactoring.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/tutorials/487-how-to-score-your-rails-apps-complexity-before-refactoring.html</feedburner:origLink></item>
		<item>
		<title>14 Bare Minimum Security Checks Before Releasing a Rails App</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/GSxnP4daZGM/486-14-bare-minimum-security-checks-before-releasing-a-rails-app.html</link>
		<comments>http://www.railsinside.com/tips/486-14-bare-minimum-security-checks-before-releasing-a-rails-app.html#comments</comments>
		<pubDate>Fri, 22 Oct 2010 23:48:18 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/tips/486-14-bare-minimum-security-checks-before-releasing-a-rails-app.html</guid>
		<description><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/10/security-check.png" width="107" height="128" alt="security check.png" style="float:left; margin-right:12px; margin-bottom:12px;" />When you upload your latest app to a production Web server and open it up to the world, you're really throwing your app to the elements - good and bad. If you don't pay any attention to security whatsoever, you're&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/10/security-check.png" width="107" height="128" alt="security check.png" style="float:left; margin-right:12px; margin-bottom:12px;" />When you upload your latest app to a production Web server and open it up to the world, you're really throwing your app to the elements - good and bad. If you don't pay any attention to security whatsoever, you're likely to fall foul of some cracker's nefarious scheme and your users will be complaining when something doesn't work or they're being spammed by geriatric Nigerian clowns with pots of gold to share. But what to do?</p>
<p>Luckily, help is at hand in the shape of the official <a href="http://guides.rubyonrails.org/security.html">Ruby on Rails Security Guide</a>, but Irish Rails developer Matthew Hutchinson has trawled through that guide as well as several illuminating blog posts relating to Rails security, and put together <a href="http://matthewhutchinson.net/2010/10/21/yet-another-rails-security-checklist"><b>a 14 step checklist of "bare minimum" security checks to do</b></a> before releasing your Rails app.</p>
<p>In summary:</p>
<ol>
<li>Don't trust logged in users. (Authentication is one thing, <i>authorization</i> to perform certain tasks is another.)</li>
<li>Beware of mass assignments. (Use <code>attr_accessible</code> in your models!)</li>
<li>Make some attributes un-editable with <code>attr_readonly</code>.</li>
<li>Watch out for SQL injection vectors. (Raw SQL in your code is a smell worth investigating.)</li>
<li>Prevent executable files from being uploaded.</li>
<li>Filter sensitive parameters from the logs.</li>
<li>Beware CSRF (Cross-Site Request Forgery) and use <code>protect_from_forgery</code> and <code>csrf_meta_tag</code>.</li>
<li>Beware XSS (Cross-Site Scripting) and use the <code>h</code> helper in views (this is the default in Rails 3, luckily).</li>
<li>Watch out for session hijacks.</li>
<li>Avoid using redirects to user supplied URLs.</li>
<li>Avoid using user params or content in the <code>send_file</code> method.</li>
<li>Make non-ActionController methods private.</li>
<li>Check your dependencies for security updates and patches.</li>
<li>Don't store passwords in the database as clear text.</li>
</ol>
<p>Want more detail? Check out <a href="http://matthewhutchinson.net/2010/10/21/yet-another-rails-security-checklist">Matthew's article</a>.</p>
<p class="s" style="padding: 12px; background-color: #ff9"><em>[ad]</em> <a href="http://coder.io/">coder.io</a> is a tagged developer news source. Want to subscribe to <a href="http://coder.io/tag/ruby">stories about Ruby</a> but not <a href="http://coder.io/tag/rails">Rails</a>? Just use the query <a href="http://coder.io/search?q=%23ruby+-%23rails">#ruby -#rails</a>. Or how about <a href="http://coder.io/search?q=%23ruby+%23screencasts">Ruby screencasts</a>?</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=14+Bare+Minimum+Security+Checks+Before+Releasing+a+Rails+App+http://www.railsinside.com/?p=486" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=14+Bare+Minimum+Security+Checks+Before+Releasing+a+Rails+App+http://www.railsinside.com/?p=486" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=GSxnP4daZGM:Dp9b1LZtDjU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=GSxnP4daZGM:Dp9b1LZtDjU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=GSxnP4daZGM:Dp9b1LZtDjU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=GSxnP4daZGM:Dp9b1LZtDjU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=GSxnP4daZGM:Dp9b1LZtDjU:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=GSxnP4daZGM:Dp9b1LZtDjU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=GSxnP4daZGM:Dp9b1LZtDjU:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=GSxnP4daZGM:Dp9b1LZtDjU:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=GSxnP4daZGM:Dp9b1LZtDjU:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/GSxnP4daZGM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/tips/486-14-bare-minimum-security-checks-before-releasing-a-rails-app.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/tips/486-14-bare-minimum-security-checks-before-releasing-a-rails-app.html</feedburner:origLink></item>
		<item>
		<title>Rails 3.0.1 and Rails 2.3.10 Released To Counter Nested Attributes Vulnerability</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/sdsQF_6AciI/480-rails-3-0-1-and-rails-2-3-10-released.html</link>
		<comments>http://www.railsinside.com/news/480-rails-3-0-1-and-rails-2-3-10-released.html#comments</comments>
		<pubDate>Fri, 15 Oct 2010 02:00:21 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/?p=480</guid>
		<description><![CDATA[<p>Michael Koziarski (a.k.a. nzkoz) has <a href="http://groups.google.com/group/rubyonrails-security/browse_thread/thread/f9f913d328dafe0c">announced the simultaneous release of Rails 3.0.1 and 2.3.10.</a> Don't get too excited - they're only very minor security releases intended to resolve a nasty bug that surfaced in 2.3.9 and 3.0.0. Upgrade if possible but&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Michael Koziarski (a.k.a. nzkoz) has <a href="http://groups.google.com/group/rubyonrails-security/browse_thread/thread/f9f913d328dafe0c">announced the simultaneous release of Rails 3.0.1 and 2.3.10.</a> Don't get too excited - they're only very minor security releases intended to resolve a nasty bug that surfaced in 2.3.9 and 3.0.0. Upgrade if possible but if you're unsure, read on for some pointers.</p>
<p>The bug in question surrounds nested attributes that are accepted through the <code>accepts_nested_attributes_for</code> method. If you're not using this method, you're <em>probably</em> OK, though I have a big fat disclaimer over that (if you don't upgrade and your app gets fried, don't blame me ;-)).</p>
<p>If you're using 2.3.9 or 3.0.0 and are truly unable to upgrade at this point but are using nested attributes, Michael has included patches <a href="http://groups.google.com/group/rubyonrails-security/browse_thread/thread/f9f913d328dafe0c">on this post.</a> You might also appreciate <a href="http://news.ycombinator.com/item?id=1792740">the discussion on Hacker News</a> if you want more info and insight.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Rails+3.0.1+and+Rails+2.3.10+Released+To+Counter+Nested+Attributes+Vulnerability+http://www.railsinside.com/?p=480" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Rails+3.0.1+and+Rails+2.3.10+Released+To+Counter+Nested+Attributes+Vulnerability+http://www.railsinside.com/?p=480" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=sdsQF_6AciI:Py_FMr_qkh0:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=sdsQF_6AciI:Py_FMr_qkh0:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=sdsQF_6AciI:Py_FMr_qkh0:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=sdsQF_6AciI:Py_FMr_qkh0:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=sdsQF_6AciI:Py_FMr_qkh0:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=sdsQF_6AciI:Py_FMr_qkh0:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=sdsQF_6AciI:Py_FMr_qkh0:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=sdsQF_6AciI:Py_FMr_qkh0:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=sdsQF_6AciI:Py_FMr_qkh0:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/sdsQF_6AciI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/news/480-rails-3-0-1-and-rails-2-3-10-released.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/news/480-rails-3-0-1-and-rails-2-3-10-released.html</feedburner:origLink></item>
		<item>
		<title>The iPhone Helpers Plugin for Rails 3.x</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/HwJuJfLXtjg/478-the-iphone-helpers-plugin-for-rails-3-x.html</link>
		<comments>http://www.railsinside.com/plugins/478-the-iphone-helpers-plugin-for-rails-3-x.html#comments</comments>
		<pubDate>Thu, 14 Oct 2010 01:57:20 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Plugins]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/?p=478</guid>
		<description><![CDATA[<p>Picking the name of a new library or plugin is stressful. You could go too informal and call your library something like <em>authgasm</em> (now authlogic) or too formal and call it "Dull Authentication Plugin for Enterprises 1.0." It's the geek equivalent&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p>Picking the name of a new library or plugin is stressful. You could go too informal and call your library something like <em>authgasm</em> (now authlogic) or too formal and call it "Dull Authentication Plugin for Enterprises 1.0." It's the geek equivalent of calling your kid Butterfly or Jane. Fair enough, but what if you just called your daughter <em>Kid</em> or <em>Girl</em>? That's the approach taken by the author of the snappily named <a href="http://github.com/mptre/rails-iphone-helpers">rails-iphone-helpers.</a></p>
<p><a href="http://github.com/mptre/rails-iphone-helpers">rails-iphone-helpers</a> is a Rails plugin that provides helper methods to produce iPhone-specific (or iOS, more precisely) HTML.</p>
<p>This library solves a simple problem, but few people have the patience or interest in memorizing the underlying code to set viewpoint sizes, scaling options, iOS icons, or iOS splash image settings. With rails-iphone-helpers, it all becomes structured and simple.. what more could you want from a plugin, really?</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=The+iPhone+Helpers+Plugin+for+Rails+3.x+http://www.railsinside.com/?p=478" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=The+iPhone+Helpers+Plugin+for+Rails+3.x+http://www.railsinside.com/?p=478" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=HwJuJfLXtjg:2GHW3GP1Kuo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=HwJuJfLXtjg:2GHW3GP1Kuo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=HwJuJfLXtjg:2GHW3GP1Kuo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=HwJuJfLXtjg:2GHW3GP1Kuo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=HwJuJfLXtjg:2GHW3GP1Kuo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=HwJuJfLXtjg:2GHW3GP1Kuo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=HwJuJfLXtjg:2GHW3GP1Kuo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=HwJuJfLXtjg:2GHW3GP1Kuo:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=HwJuJfLXtjg:2GHW3GP1Kuo:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/HwJuJfLXtjg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/plugins/478-the-iphone-helpers-plugin-for-rails-3-x.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/plugins/478-the-iphone-helpers-plugin-for-rails-3-x.html</feedburner:origLink></item>
		<item>
		<title>The First Step of Refactoring a Rails Application</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/RL6AfxNdnKE/460-the-first-step-of-refactoring-a-rails-application.html</link>
		<comments>http://www.railsinside.com/uncategorized/460-the-first-step-of-refactoring-a-rails-application.html#comments</comments>
		<pubDate>Fri, 08 Oct 2010 01:06:31 +0000</pubDate>
		<dc:creator>Eric Davis</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/?p=460</guid>
		<description><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2009/10/tickbox.png" width="117" height="127" alt="tickbox.png" style="float:left; margin-right:12px; margin-bottom:12px;" />Refactoring is an important step in software development.  It helps to make sure that existing code is kept updated and clean, even after a herd of people trample over it.</p>
<p>Recently I've been asked a lot as to which tools I&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2009/10/tickbox.png" width="117" height="127" alt="tickbox.png" style="float:left; margin-right:12px; margin-bottom:12px;" />Refactoring is an important step in software development.  It helps to make sure that existing code is kept updated and clean, even after a herd of people trample over it.</p>
<p>Recently I've been asked a lot as to which tools I use to refactor Rails apps. I don&#039;t use any one tool to refactor, but instead have a toolbox of several tools.  Having several tools at your disposal gives you more flexibility to find what code <em>needs</em> to be refactored.</p>
<h3 id="intuition">Intuition</h3>
<p>The first and primary tool I use is intuition.  If you know your code really well, you will already know which areas cause problems and need to be refactored.</p>
<p>If you are new to a code base though, you won&#039;t have this intuition and need to build it up before you can use it.  Luckily there are several tools to find problem code that is just waiting for you to refactor them.</p>
<h3 id="wc_the_unix_word_counter">wc - the Unix word counter</h3>
<p>The first tool is a simple Unix tool called <code>wc</code>.  <code>wc</code> is the word count command and it&#039;s installed on almost all Unixes by default.  It does more than count words though, it also counts the number of lines in a file.  In my experience, classes and files with the most lines tend to need the most refactoring.  If you think about it, more lines means more code which means a greater likelihood of bad code.</p>
<p>Using <code>wc -l</code> you can easily get line counts for all of the major areas of your Rails project.  I typically just look in the controllers and models since that&#039;s where most development takes place but you might also want to check your lib and vendor directories.  What you are looking for are large and complex classes.</p>
<p>If you have a lot of classes, like <a href="http://www.redmine.org">Redmine</a> does, it can be useful to pipe the output to <code>sort -n</code> which sorts it numerically.</p>
<pre>
$ wc -l app/controllers/*.rb | sort -n
    25 app/controllers/auto_completes_controller.rb
    25 app/controllers/ldap_auth_sources_controller.rb
    26 app/controllers/project_enumerations_controller.rb
    ... snip ...
   248 app/controllers/wiki_controller.rb
   271 app/controllers/projects_controller.rb
   272 app/controllers/account_controller.rb
   322 app/controllers/repositories_controller.rb
   324 app/controllers/timelog_controller.rb
   326 app/controllers/issues_controller.rb
   412 app/controllers/application_controller.rb
  5381 total
</pre>
<pre>
$ wc -l app/models/*.rb | sort -n
    22 app/models/document_observer.rb
    22 app/models/group_custom_field.rb
    22 app/models/issue_observer.rb
    ... snip ...
   200 app/models/changeset.rb
   202 app/models/wiki_page.rb
   215 app/models/repository.rb
   234 app/models/version.rb
   336 app/models/mail_handler.rb
   416 app/models/user.rb
   442 app/models/mailer.rb
   643 app/models/query.rb
   774 app/models/project.rb
   863 app/models/issue.rb
  7412 total
</pre>
<h3 id="reviewing_the_results_from_wc">Reviewing the results from wc</h3>
<p>You want to look for a few things with raw line counts:</p>
<ul>
<li>is there a class with a disproportionate number of lines compared to the others?</li>
<li>are there more lines in the controllers than the models?</li>
</ul>
<p>In general, a well factored Rails application will have a majority of its code in the models and most classes will be the same size.  There might be a few major classes that are larger than the rest, which are the primary domain objects.  Using Redmine as an example, you would expect any Project, Issue, and User classes to be large since it&#039;s a project management and bug tracking application.  Looking at the line counts from <code>wc</code>, the Timelog controller and Query model have a considerable number of lines even though they aren&#039;t the primary domain objects. In fact, because of my intuition from working with Redmine for years, I know both of these classes need some major refactoring.</p>
<h3 id="reading_the_code_to_find_refactorings">Reading the code to find refactorings</h3>
<p>After you see which classes are the largest, you will want to read through the class itself.  Look for how &#034;thick&#034; the class is and see what you can learn about it&#039;s structure.</p>
<ul>
<li><strong>Are there a few large method that contain most of the code for the class?</strong> Might be able to use extract method and extract class to shrink their size.</li>
<li><strong>Are there a lot of short methods?</strong>  Maybe the code was over-factored or the class is trying to do too much and needs to be split.</li>
<li><strong>Are there a lot of comments?</strong> Since <code>wc</code> counts comments as lines too, <code>wc</code> might report that a class is large but there might not be that much actual code there.</li>
</ul>
<p>After reading through some classes you will start to get a feel for what areas to refactor and if there are any common problems.  You should also be able to start working on a few refactorings as you go.</p>
<p>Next time I&#039;ll talk about using some tools that understand Ruby and what makes Ruby code complex.</p>
<p style="padding: 8px; background-color: #eee"><img src="http://gravatar.com/avatar/ae959c6836366656b895069d75ad09bf?size=64" alt="Eric Davis" style="float: left; margin-right: 12px; margin-bottom: 12px"><strong>This is a guest post by Eric Davis.</strong>  Eric is a member of the Redmine team and has written an ebook <a href="http://www.refactoringredmine.com/">Refactoring Redmine</a> to show Rails developers what refactoring real Rails code looks like.  He writes about the different refactorings done to Redmine every day at <a href="http://theadmin.org">http://theadmin.org</a>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=The+First+Step+of+Refactoring+a+Rails+Application+http://www.railsinside.com/?p=460" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=The+First+Step+of+Refactoring+a+Rails+Application+http://www.railsinside.com/?p=460" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=RL6AfxNdnKE:sMwErDmgzVI:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=RL6AfxNdnKE:sMwErDmgzVI:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=RL6AfxNdnKE:sMwErDmgzVI:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=RL6AfxNdnKE:sMwErDmgzVI:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=RL6AfxNdnKE:sMwErDmgzVI:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=RL6AfxNdnKE:sMwErDmgzVI:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=RL6AfxNdnKE:sMwErDmgzVI:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=RL6AfxNdnKE:sMwErDmgzVI:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=RL6AfxNdnKE:sMwErDmgzVI:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/RL6AfxNdnKE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/uncategorized/460-the-first-step-of-refactoring-a-rails-application.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/uncategorized/460-the-first-step-of-refactoring-a-rails-application.html</feedburner:origLink></item>
		<item>
		<title>An Introduction to Refinery CMS – A Rails Content Management System</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/f0dS5sBgkAk/459-an-introduction-to-refinery-cms-a-rails-content-management-system.html</link>
		<comments>http://www.railsinside.com/misc/459-an-introduction-to-refinery-cms-a-rails-content-management-system.html#comments</comments>
		<pubDate>Thu, 22 Jul 2010 20:53:49 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/misc/459-an-introduction-to-refinery-cms-a-rails-content-management-system.html</guid>
		<description><![CDATA[<p><strong><a href="http://refinerycms.com">Refinery CMS</a> is an open source Ruby on Rails CMS for small businesses.</strong> The project was originally closed source for 4 years at <a href="http://resolvedigital.co.nz">Resolve Digital</a> until it was finally released to the open source community in mid 2009. Refinery focuses on doing things&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://refinerycms.com">Refinery CMS</a> is an open source Ruby on Rails CMS for small businesses.</strong> The project was originally closed source for 4 years at <a href="http://resolvedigital.co.nz">Resolve Digital</a> until it was finally released to the open source community in mid 2009. Refinery focuses on doing things <em>"the Rails way"</em> where possible. This means you don't have to learn too much to start theming it and building your own custom plugins.</p>
<p><img src="http://www.railsinside.com/wp-content/uploads/2010/07/refinery-dashboard.png" width="480" height="427" alt="refinery-dashboard.png" /></p>
<h3>What it's it good at?</h3>
<p>Refinery is great for small business sites where the client needs to be able to update their website themselves without being bombarded with anything too complicated.</p>
<p>Unlike other content managers, Refinery is truly aimed at the end user making it easy for them to pick up and make changes themselves. The UI is clean and simple so the end user feels at ease and hopefully won't bug the developer with questions!</p>
<h3>What Features Does It Have?</h3>
<ul>
<li>Theming support</li>
<li>Easy to use Rails-like plugin generator and plugin architecture</li>
<li>WYSIWYG content editing</li>
<li>Localisation (currently supports 10 langauges)</li>
<li>Page management</li>
<li>Image and File management</li>
<li>Contact form and inquiry management</li>
<li>Search Engine Optimisation</li>
</ul>
<h3>How do I install it?</h3>
<p>Firstly install the Refinery CMS gem. This gives you a 'refinerycms' command you can run that creates a new Rails project with Refinery CMS hooked into it.</p>
<p><code>gem install refinerycms<br />
refinerycms path/to/project</code></p>
<p>Finally change into the project start the web server</p>
<p><code>cd path/to/project<br />
ruby ./script/server</code></p>
<p>Visit <a href="http://localhost:3000">http://localhost:3000</a> and set up your first Refinery user.</p>
<h2>What's coming up in Refinery CMS</h2>
<p>Refinery is gearing up for it's 1.0 release with Rails 3.0 support. There is also a Refinery Day coming up where members of the community will be combining efforts to support Rails 3. Check the Google Groups below for details.</p>
<h3>Useful Links</h3>
<ul>
<li><a href="http://refinerycms.com">Refinery CMS Website</a></li>
<li><a href="http://refinerycms.org">GitHub Repository</a></li>
<li><a href="http://demo.refinerycms.com/admin">Official Demo Site</a></li>
<li><a href="http://group.refinerycms.org">Refinery CMS Google Group</a></li>
<li><a href="irc://irc.freenode.net/refinerycms">Official IRC Channel</a></li>
</ul>
<p class="s" style="min-height: 60px; padding: 8px; background-color: #ff6"><img src="http://www.railsinside.com/wp-content/uploads/2010/07/david-jones.jpg" width="64" height="64" alt="david-jones.jpg" style="float:right; margin-bottom:8px; margin-left:8px;" />Post written by <a href="http://resolvedigital.co.nz">David Jones</a>. David started Refinery CMS in 2004 and is the Technical Director at <a href="http://resolvedigital.co.nz">Resolve Digital</a>, a Rails development company with offices in New Zealand and California.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=An+Introduction+to+Refinery+CMS+%E2%80%93+A+Rails+Content+Management+System+http://www.railsinside.com/?p=459" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=An+Introduction+to+Refinery+CMS+%E2%80%93+A+Rails+Content+Management+System+http://www.railsinside.com/?p=459" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=f0dS5sBgkAk:VuSxYRWS0ig:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=f0dS5sBgkAk:VuSxYRWS0ig:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=f0dS5sBgkAk:VuSxYRWS0ig:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=f0dS5sBgkAk:VuSxYRWS0ig:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=f0dS5sBgkAk:VuSxYRWS0ig:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=f0dS5sBgkAk:VuSxYRWS0ig:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=f0dS5sBgkAk:VuSxYRWS0ig:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=f0dS5sBgkAk:VuSxYRWS0ig:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=f0dS5sBgkAk:VuSxYRWS0ig:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/f0dS5sBgkAk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/misc/459-an-introduction-to-refinery-cms-a-rails-content-management-system.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/misc/459-an-introduction-to-refinery-cms-a-rails-content-management-system.html</feedburner:origLink></item>
		<item>
		<title>The Perils Of Opinionated Software (like Rails)</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/wyDu2T51rdI/455-the-perils-of-opinionated-software-like-rails.html</link>
		<comments>http://www.railsinside.com/misc/455-the-perils-of-opinionated-software-like-rails.html#comments</comments>
		<pubDate>Tue, 06 Jul 2010 02:10:14 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/?p=455</guid>
		<description><![CDATA[<p style="padding: 8px; background-color: #ff6">This is a guest opinion piece by Xavier Shay.</p>
<p>Ruby on Rails, by its own admission, is an opinionated framework. From day one it has positioned itself as the Kryptonite to enterprise software, providing an easy to use, rapid development framework.&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p style="padding: 8px; background-color: #ff6">This is a guest opinion piece by Xavier Shay.</p>
<p>Ruby on Rails, by its own admission, is an opinionated framework. From day one it has positioned itself as the Kryptonite to enterprise software, providing an easy to use, rapid development framework. The <a href="http://rubyonrails.org/screencasts">infamous 15 minute blog video</a> set a tone which has continued through to this day: if it's not quick to build and in Ruby, we're not interested.</p>
<p>Rails takes an extreme viewpoint, the polar opposite of the XML heavy, configuration tangled mess of traditional enterprise software. This viewpoint is necessary---without it we have no alternative---but that doesn't mean it is the best way to build applications. In their book "<a href="http://en.wikipedia.org/wiki/First,_Break_All_the_Rules">First, Break All The Rules</a>", Marcus Buckingham and Curt Coffman explain that the the common method of selecting top managers by looking for the opposite of bad managers is wrong. Research showed that this strategy tended to select good managers, but not the best managers. They found that the best and worst managers actually share a lot of the same characteristics! If you want good managers, then study good managers, not bad ones. The same principle applies to software: you won't figure out how to build the best software by studying the worst.</p>
<p>Studying the bad is <i>exactly</i> the approach the Rails team has taken, though. They have studied enterprise software, and built the opposite. In the process, they have unquestionably made some breakthroughs in how to write quality software fast (that's why we all use it!), but in what ways have they thrown the baby out with the bathwater? What attributes of the worst enterprise software are also found in the best software?</p>
<p>Relational databases have been around for decades, and are solid pieces of infrastructure. They can do some really cool stuff, but Rails considers them no more than a necessary evil. The less the database does, the better. I appreciate the philosophy: if we can move logic from the database in to our ruby application code, that's a win, right? In practice however, this doesn't work. It physically <i>cannot</i> work. In addition, it's actually <i>slower</i> (in terms of development time) and _less_ maintainable to do certain things in ruby rather than the database!</p>
<p>Relational databases know how to manage relational data. That's what they do, it's in their name. Referential integrity ensures that a child row always has a valid reference to a parent row. If a child has parent_id of 1, then a parent with an id of 1 is guaranteed to exist. Referential integrity has been a solved problem for decades using foreign keys. It is a proven fundamental property of solid applications, yet Rails has no best practice for using them. Rails has tried to reinvent the wheel and do it in ruby (with the <code>has_many :dependent</code> option), but it's half baked and cannot cover even simple edge cases. Try this thought experiment: one of your application servers adds a child row to a parent, while another one deletes that same parent at the same time. How you can prevent the child row from being orphaned? You can't, not without using your database.</p>
<p>Even something as simple as not null constraints, a fundamental principle of data design, are thrown away in the extreme polarized Rails opinion. You can just use <code>validates_presence_of</code>! Once again nice in theory, but I have yet to see a large evolving Rails application that hadn't had at least one null in its database where it shouldn't have been (subsequently causing errors). Even if I had, it's the cheapest safety net you can buy: all it "costs" you is a <code>:null =&gt; false</code> declaration in your migration and you never have to think about it again. No one in your team, not even the new rookie graduate, ever has to think about it again or run the risk of accidentally bypassing validations.</p>
<p>I'm not faulting the Rails team here. They have taken a hard line position and stuck with it, which is important for our industry. As software professionals though, we have a very different mandate than the Rails team. They are defining and pushing the boundaries of how we build software, where as our job is to find the best compromise of existing technologies to provide business value. This sweet spot will inevitably lie somewhere between extreme opinions.</p>
<p style="padding: 8px; background-color: #ff6">This is a guest post by Xavier Shay. He is touring his <a href="http://www.dbisyourfriend.com/" target="_blank">"Database Is Your Friend"</a> training course through the US and UK in July, August and September, in which he teaches you how to find the sweet spot of database usage for building rock solid Rails applications without compromising your velocity. The tour is more than likely coming to your city, so check <a href="http://www.dbisyourfriend.com/" target="_blank">www.dbisyourfriend.com</a> for more details.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=The+Perils+Of+Opinionated+Software+%28like+Rails%29+http://www.railsinside.com/?p=455" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=The+Perils+Of+Opinionated+Software+%28like+Rails%29+http://www.railsinside.com/?p=455" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=wyDu2T51rdI:NcywDWpIZG4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=wyDu2T51rdI:NcywDWpIZG4:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=wyDu2T51rdI:NcywDWpIZG4:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=wyDu2T51rdI:NcywDWpIZG4:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=wyDu2T51rdI:NcywDWpIZG4:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=wyDu2T51rdI:NcywDWpIZG4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=wyDu2T51rdI:NcywDWpIZG4:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=wyDu2T51rdI:NcywDWpIZG4:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=wyDu2T51rdI:NcywDWpIZG4:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/wyDu2T51rdI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/misc/455-the-perils-of-opinionated-software-like-rails.html/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/misc/455-the-perils-of-opinionated-software-like-rails.html</feedburner:origLink></item>
		<item>
		<title>Netzke: Rich Internet Apps with Ext JS and Rails</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/-u7PylYOKt4/454-netzke-rich-internet-apps-with-ext-js-and-rails.html</link>
		<comments>http://www.railsinside.com/misc/454-netzke-rich-internet-apps-with-ext-js-and-rails.html#comments</comments>
		<pubDate>Sun, 20 Jun 2010 22:51:02 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Miscellaneous]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/misc/454-netzke-rich-internet-apps-with-ext-js-and-rails.html</guid>
		<description><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/06/netzke.png" width="146" height="134" alt="netzke.png" style="float:left; margin-right:12px; margin-bottom:12px; border:1px #000000 solid;" /><a href="http://www.sencha.com/products/js/">Ext JS</a> is a cross-browser JavaScript library for building rich internet applications. It provides an extended set of powerful, feature-rich widgets that can be used as building blocks for <span class="caps">AJAX</span>-driven <span class="caps">GUI</span> of almost unlimited complexity. <a href="http://netzke.org/">Netzke</a> is a framework that provides a unified&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/06/netzke.png" width="146" height="134" alt="netzke.png" style="float:left; margin-right:12px; margin-bottom:12px; border:1px #000000 solid;" /><a href="http://www.sencha.com/products/js/">Ext JS</a> is a cross-browser JavaScript library for building rich internet applications. It provides an extended set of powerful, feature-rich widgets that can be used as building blocks for <span class="caps">AJAX</span>-driven <span class="caps">GUI</span> of almost unlimited complexity. <a href="http://netzke.org/">Netzke</a> is a framework that provides a unified way to build clean, reusable and maintainable back-end code for an Ext JS app in Rails.</p>
<p>A good example of a Ext JS widget that depends heavily on client-server communication is a grid panel. It provides a convenient <span class="caps">GUI</span> for multi-line <span class="caps">CRUD</span> operations, as well as for the searching, filtering, and pagination of the data. Configuring an Ext JS grid panel in JavaScript will take quite some time <strong>even</strong> if you’re an experienced Ext JS developer - it's tedious work! How about using <strong>a lot</strong> of grid panels (normally bound to different database tables) all throughout your application? You soon realize, that not only your JavaScript code for those grid has to become reusable in some way, but also the server-side code (that responds to all the grid panel’s <span class="caps">AJAX</span> calls), will grow very quickly in a not-so-DRY manner.</p>
<p>This is where Netzke shines. It abstracts both client- and server-side code into components. By definition, components are reusable, isolated and configurable pieces of code with a well-defined functionality. A Netzke component (a “widget”) is a Ruby class that “knows” how to build and instantiate its JavaScript part (used in a browser), as well as how to respond to <span class="caps">AJAX</span> calls coming back to the server part. All communication – while being done over the Internet – happens “within” the component. Do you want to put several grid panels on the same web-page? Or maybe you want to dynamically load another grid in a modal window? While sharing the code (both JavaScript and Ruby), each of the grids will talk to its own instance, managing a separate ActiveRecord model if needed. See it in action <a href="http://demo.netzke.org/grid_panel">here</a>.</p>
<p>Netzke GridPanel widget is only one example of what can be done with the <a href="http://netzke.org">Netzke framework</a>. Its philosophy is the following: create a widget once (you’ll need Ext JS knowledge for that, of course), and then reuse it all over again (or share it with the others), without the need to write JavaScript anymore. Besides, Netzke components are easily extendible, just use <span class="caps">OOP</span>: inheriting from Netzke::GridPanel provides for automatic prototype-based “inheritance” on the JavaScript level, too! Combining several widgets into a compound widget is also no problem.</p>
<p>The <a href="http://github.com/skozlov/netzke-basepack">netzke-basepack project</a> contains a set of pre-built Netzke widgets that can be used as basis for your <span class="caps">RIA</span>. And if you like to know more about different aspects of Netzke, browse through a number of tutorials on the <a href="http://blog.writelesscode.com">WriteLessCode blog</a></p>
<p><em>This post is by Sergei Kozlov.</em></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Netzke%3A+Rich+Internet+Apps+with+Ext+JS+and+Rails+http://www.railsinside.com/?p=454" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Netzke%3A+Rich+Internet+Apps+with+Ext+JS+and+Rails+http://www.railsinside.com/?p=454" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=-u7PylYOKt4:gCHLh1wkOfo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=-u7PylYOKt4:gCHLh1wkOfo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=-u7PylYOKt4:gCHLh1wkOfo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=-u7PylYOKt4:gCHLh1wkOfo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=-u7PylYOKt4:gCHLh1wkOfo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=-u7PylYOKt4:gCHLh1wkOfo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=-u7PylYOKt4:gCHLh1wkOfo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=-u7PylYOKt4:gCHLh1wkOfo:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=-u7PylYOKt4:gCHLh1wkOfo:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/-u7PylYOKt4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/misc/454-netzke-rich-internet-apps-with-ext-js-and-rails.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/misc/454-netzke-rich-internet-apps-with-ext-js-and-rails.html</feedburner:origLink></item>
		<item>
		<title>HOWTO: Unobtrusive JavaScript with Rails 3</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/SCEc22We7_E/451-howto-unobtrusive-javascript-with-rails-3.html</link>
		<comments>http://www.railsinside.com/tips/451-howto-unobtrusive-javascript-with-rails-3.html#comments</comments>
		<pubDate>Mon, 24 May 2010 13:04:25 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/tips/451-howto-unobtrusive-javascript-with-rails-3.html</guid>
		<description><![CDATA[<p class="s"><strong>This post is by Rizwan Reza.</strong> See footer for more info.</p>
<p><img src="http://www.railsinside.com/wp-content/uploads/2010/05/sanjuanoil.png" width="128" height="122" alt="sanjuanoil.png" style="float:left; margin-right:12px; margin-bottom:12px; border:1px #000000 solid;" />One of the big surprises and accomplishments is the fact that Unobtrusive Javascript made it into Rails 3. At first, we <a href="http://twitter.com/obie/status/8007862895">thought</a> UJS wasn’t going to be included in Rails 3. Well,&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p class="s"><strong>This post is by Rizwan Reza.</strong> See footer for more info.</p>
<p><img src="http://www.railsinside.com/wp-content/uploads/2010/05/sanjuanoil.png" width="128" height="122" alt="sanjuanoil.png" style="float:left; margin-right:12px; margin-bottom:12px; border:1px #000000 solid;" />One of the big surprises and accomplishments is the fact that Unobtrusive Javascript made it into Rails 3. At first, we <a href="http://twitter.com/obie/status/8007862895">thought</a> UJS wasn’t going to be included in Rails 3. Well, just before the first beta came out, the community <a href="http://twitter.com/dhh/status/8391549740">responded</a> well and a bunch of enthusiastic developers finished up one of the most wanted feature in Rails 3.</p>
<p>Rails has always been about staying on the cutting edge and Rails 3 is no surprise, <span class="caps">UJS</span> implementation in Rails 3 takes benefit of the new <span class="caps">HTML5</span> <code>data-*</code>@ attributes. So Rails doesn’t spit out Prototype-based Javascript inline (the old helpers are still <a href="http://github.com/rails/prototype_legacy_helper">here</a>). Rather, the helpers just define an appropriate data attribute in the tag, and that’s where Javascript comes in.</p>
<p>This literally means you can pick the data attributes in any Javascript framework and write generic code to support Ajax implementation of any kind. As you can imagine, this can be a highly flexible approach for demanding applications. But there’s more, the generic Prototype implementation is included with Rails 3 and the jQuery version is maintained officially <a href="http://github.com/rails/jquery-ujs">here</a>.</p>
<p>Let’s see how easy it is to swap jQuery in Rails 3. In the root of a Rails 3 application, run:</p>
<pre>
<code>curl -L http://code.jquery.com/jquery-1.4.2.min.js &gt; public/javascripts/jquery.js
curl -L http://github.com/rails/jquery-ujs/raw/master/src/rails.js &gt; public/javascripts/rails.js
</code>
</pre>
<p>Here’s an initializer I got to know from Yehuda that you can define in <code>config/initializers</code> so <code>javascript_include_tag :defaults</code> uses jQuery instead of Prototype.</p>
<pre>
<code>module ActionView::Helpers::AssetTagHelper
  remove_const :JAVASCRIPT_DEFAULT_SOURCES
  JAVASCRIPT_DEFAULT_SOURCES = %w(jquery.js rails.js)

  reset_javascript_include_default
end</code>
</pre>
<p>With that set, Rails is now unaware of Prototype, all of the helpers with <code>:remote =&gt; true</code> will be grabbed by rails.js and worked through jQuery. You might also want to remove the Prototype libraries inside <code>public/javascripts</code> if you’re not going to use them.</p>
<p>As you can see, <span class="caps">UJS</span> in Rails 3 is pretty easy. Though there is a bit of a configuration to be done if you’re going against the default option in Rails, it’s far easier to work with than in the previous versions. You should also look at the fantastic <a href="http://guides.rails.info/3_0_release_notes.html">Rails 3 Release Notes</a> for changes in the concerned helpers and the section on Unobtrusive Javascript in <a href="http://www.railsdispatch.com/posts/upgrading-a-rails-2-app-to-rails-3">my article</a> on <a href="http://www.railsdispatch.com/">RailsDispatch</a>.</p>
<p class="s"><em>[post by]</em> Rizwan Reza is a passionate, self-taught developer and designer who’s been working with Rails since early 2005. He had his first Rails patch accepted in mid 2008, and has been contributing code and fixes ever since. Rizwan focuses on the start-to-finish product experience, all the way from branding to the application backend. Get in touch with him at <em>contact <del>at</del> rizwanreza.com</em>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=HOWTO%3A+Unobtrusive+JavaScript+with+Rails+3+http://www.railsinside.com/?p=451" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=HOWTO%3A+Unobtrusive+JavaScript+with+Rails+3+http://www.railsinside.com/?p=451" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=SCEc22We7_E:mg_8OecmsYo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=SCEc22We7_E:mg_8OecmsYo:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=SCEc22We7_E:mg_8OecmsYo:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=SCEc22We7_E:mg_8OecmsYo:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=SCEc22We7_E:mg_8OecmsYo:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=SCEc22We7_E:mg_8OecmsYo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=SCEc22We7_E:mg_8OecmsYo:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=SCEc22We7_E:mg_8OecmsYo:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=SCEc22We7_E:mg_8OecmsYo:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/SCEc22We7_E" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/tips/451-howto-unobtrusive-javascript-with-rails-3.html/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/tips/451-howto-unobtrusive-javascript-with-rails-3.html</feedburner:origLink></item>
		<item>
		<title>Baltimore Welcomes RailsConf With Open Arms</title>
		<link>http://feedproxy.google.com/~r/RailsInside/~3/IaArhbErE3M/438-baltimore-welcomes-railsconf-with-open-arms.html</link>
		<comments>http://www.railsinside.com/uncategorized/438-baltimore-welcomes-railsconf-with-open-arms.html#comments</comments>
		<pubDate>Tue, 18 May 2010 02:39:43 +0000</pubDate>
		<dc:creator>Peter Cooper</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://www.railsinside.com/?p=438</guid>
		<description><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/05/logo300.png" alt="Baltimore on Rails" title="Baltimore on Rails" width="120" class="alignleft wp-image-437" style="border: 1px solid #000; margin-right: 12px; margin-bottom: 12px" /><a href="http://bmoreonrails.org">Baltimore's Rails community</a> has been eagerly anticipating <a href="http://railsconf.og">RailsConf</a> next month.  They've organized a few different projects to welcome Rails programmers to the city:</p>
<p><a href="http://www.railsinside.com/events/411-ignite-railsconf-pre-conference-lightning-talks-on-june-6-2010.html">Ignite RailsConf</a>: an unofficial pre-party held on June 6th with a variety of lightning talks, featuring Ruby luminaries like Chris&#8230;</p>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.railsinside.com/wp-content/uploads/2010/05/logo300.png" alt="Baltimore on Rails" title="Baltimore on Rails" width="120" class="alignleft wp-image-437" style="border: 1px solid #000; margin-right: 12px; margin-bottom: 12px" /><a href="http://bmoreonrails.org">Baltimore's Rails community</a> has been eagerly anticipating <a href="http://railsconf.og">RailsConf</a> next month.  They've organized a few different projects to welcome Rails programmers to the city:</p>
<p><a href="http://www.railsinside.com/events/411-ignite-railsconf-pre-conference-lightning-talks-on-june-6-2010.html">Ignite RailsConf</a>: an unofficial pre-party held on June 6th with a variety of lightning talks, featuring Ruby luminaries like Chris Wanstrath, Gregg Pollack, and Ilya Grigorik.</p>
<p><a href="http://bmoreonrails.org/stay-with-a-local">Stay with a Local</a>, a website to connect RailsConf attendees with Baltimore Rubyists.  9 Bmore on Rails members have opened up a total of 12 rooms in their homes to host attendees traveling to Baltimore.</p>
<p><a href="http://bohconf.com/">BohConf</a>, a free <a href='http://en.wikipedia.org/wiki/Unconference'>unconf</a> running in parallel with RailsConf.  It will be held in the convention center for the duration of RailsConf.  This hacking-centric event will include community code drives featuring well known OSS authors, a code retreat, a programming competition, and "BarCamp"-style discussions.</p>
<p style="background-color: #ff6"><em>[post by]</em> Mike Subelsky is co-founder of the Rails-backed startup <a href="http://otherinbox.com">OtherInbox</a>. He occasionally blogs at <a href="http://subelsky.com">subelsky.com</a> and lives in Baltimore.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Baltimore+Welcomes+RailsConf+With+Open+Arms+http://www.railsinside.com/?p=438" title="Post to Twitter"><img class="nothumb" src="http://www.railsinside.com/wp-content/plugins/tweet-this/icons/tt-twitter.png" alt="Post to Twitter" /></a> <a class="tt" href="http://twitter.com/home/?status=Baltimore+Welcomes+RailsConf+With+Open+Arms+http://www.railsinside.com/?p=438" title="Post to Twitter">Tweet This Post</a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/RailsInside?a=IaArhbErE3M:oyzYyoxVozg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/RailsInside?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=IaArhbErE3M:oyzYyoxVozg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=IaArhbErE3M:oyzYyoxVozg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=IaArhbErE3M:oyzYyoxVozg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=IaArhbErE3M:oyzYyoxVozg:F7zBnMyn0Lo" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=IaArhbErE3M:oyzYyoxVozg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=IaArhbErE3M:oyzYyoxVozg:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/RailsInside?a=IaArhbErE3M:oyzYyoxVozg:3H-1DwQop_U"><img src="http://feeds.feedburner.com/~ff/RailsInside?i=IaArhbErE3M:oyzYyoxVozg:3H-1DwQop_U" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/RailsInside/~4/IaArhbErE3M" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.railsinside.com/uncategorized/438-baltimore-welcomes-railsconf-with-open-arms.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.railsinside.com/uncategorized/438-baltimore-welcomes-railsconf-with-open-arms.html</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 2.830 seconds. --><!-- Cached page generated by WP-Super-Cache on 2013-05-22 01:36:26 -->
