Skip to content


Subverting Rails Reserved Words

I’ve been thinking about Rails reserved words lately, and I’ve come up with a solution that works in theory. Before I share my solution, let me help you understand where my frustration comes from.

<p>ActiveRecord makes database access pretty darn simple.  With two lines of code, you can be connected to a database and slurping data.  A while back, I was making a template system, and unsurprisingly, I had a ActiveRecord class named Template, and a controller named TemplatesController.</p>


<p>As soon as I did this, I started running into errors:</p>


<p><img src="http://idisk.mac.com/osesm/Public/Pictures/Skitch/Action_Controller__Exception_caught-20080702-064151.png" alt="" /></p>


<p>What is happening here is that Rails is requiring an instance variable named @template, and I&#8217;ve stomped all over it by creating my own.</p>


<p>Here is another example of an error that had me boggled for way longer than it should have:</p>


<p><img src="http://idisk.mac.com/osesm/Public/Pictures/Skitch/Action_Controller__Exception_caught-20080702-064419.png" alt="" /></p>


<p>This happens be it looks like Rails is depending on another instance variable.</p>


<p>My solution for instance variables simple.  In Views, Rails will set an instance variable with a not so common name.  I&#8217;m leaning towards <code>__variable_name__</code> or even <code>__rails_instance_hash[:key]__</code>.  This way, there isn&#8217;t any confusion when it comes to instance variable names.</p>


<p>Another space where there are conflicts are in ActiveRecord models.  You can&#8217;t have a text field called errors.</p>


<p><img src="http://idisk.mac.com/osesm/Public/Pictures/Skitch/bryan%40dmac__tmp_template_test-20080702-065201.png" alt="" /></p>


<p>Rails assumes the errors method of your ActiveRecord object to be an instance of ActiveRecord::Errors.</p>


<p><img src="http://idisk.mac.com/osesm/Public/Pictures/Skitch/bryan%40dmac__tmp_template_test-20080702-065302.png" alt="" /></p>


<p>In my opinion, this doesn&#8217;t make the most since.  I believe we could apply the double underscores here as well.  Instead of <strong><code>#errors</code></strong>, it would be <strong><code>#__errors__</code></strong>.  You should be able to have any attribute name as long as it is legal for the underlying database.  Rails should not be polluting your model namespace.</p>


<p>One problem with these changes is Rails has been like this for a few years now.  Old code would break, so these types of changes would have to be introduced in a major release.  The benefit of these changes could be huge.  Lessening the chance that your code will tramp over Rails internals could be a great thing.</p>

Posted in Uncategorized.