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’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’m leaning towards <code>__variable_name__</code> or even <code>__rails_instance_hash[:key]__</code>. This way, there isn’t any confusion when it comes to instance variable names.</p>
<p>Another space where there are conflicts are in ActiveRecord models. You can’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’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>