<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>blog.opensteam.net</title>
    <link>http://blog.opensteam.net</link>
    <language>en</language>
    <webMaster>notyce@gmail.com (opensteam.net, diamonddogs group)</webMaster>
    <copyright>Copyright 2007-2010</copyright>
    <ttl>60</ttl>
    <pubDate>Mon, 06 Apr 2009 18:51:00 GMT</pubDate>
    <description></description>
    <item>
      <title>has_many + dynamic conditions</title>
      <link>http://blog.opensteam.net/past/2009/4/6/has_many_dynamic_conditions/</link>
      <pubDate>Mon, 06 Apr 2009 18:36:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2009/4/6/has_many_dynamic_conditions/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;In our latest project we had to implement condition-based categories. (like a category which holds all products with a price greater than X).&lt;/p&gt;

&lt;p&gt;We serialized the condition-hash into a 'category_conditions' column and implemented a proxy-association method to evaluate the condition and return a scope (to keep method-chaining working):&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;Category&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SupportFunction"&gt;has_many&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;products&lt;/span&gt; &lt;span class="Keyword"&gt;do&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;with_condition&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;      &lt;span class="SourceBase"&gt;&lt;span class="FunctionName"&gt;scoped&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;conditions&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; proxy_owner&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;category_conditions&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;No we can use it like this:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; c &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;Category&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;create&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;category_condition&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;price &amp;gt;= ?&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;99&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; c&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;products&lt;/span&gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; regular associated products&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; c&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;products&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;with_condition&lt;/span&gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; products with a price greater than 99&lt;/span&gt;
&lt;/pre&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/activerecord">activerecord</category>
      <category domain="http://blog.opensteam.net/past/tags/rails">rails</category>
    </item>
    <item>
      <title>rails 2.3 + engines + helpers</title>
      <link>http://blog.opensteam.net/past/2009/3/28/rails_23_engines_helpers/</link>
      <pubDate>Sat, 28 Mar 2009 22:50:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2009/3/28/rails_23_engines_helpers/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;According to this ticket &lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/1905-apphelpers-within-plugin-not-being-mixed-in"&gt;#1905&lt;/a&gt;, app/helpers in rails plugins-engines doesn't get mixed into the ActionView::Base, and so the methods are not available in the views.&lt;/p&gt;

&lt;p&gt;The reason for this is, that the "all_application_helpers" method in ActionController::Helper only returns the helper modules in RAILS_ROOT/app/helper and not those in vendor/plugins/**/app/helpers:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;file: action_controller/helpers.rb&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;line: 219&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;        &lt;span class="Comment"&gt;#&lt;/span&gt; Extract helper names from files in app/helpers/**/*.rb&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;all_application_helpers&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;     extract &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="RegularExpression"&gt;^&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;#{&lt;/span&gt;&lt;span class="SourceBase"&gt;Regexp&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;quote&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;helpers_dir&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="StringEscapes"&gt;\/&lt;/span&gt;?&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;(&lt;/span&gt;.*&lt;span class="RegularExpression"&gt;)&lt;/span&gt;&lt;/span&gt;_helper.rb$&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;     &lt;span class="SourceBase"&gt;Dir&lt;/span&gt;&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;#{&lt;/span&gt;helpers_dir&lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;/**/*_helper.rb&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;map&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;file&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt; file&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;sub&lt;/span&gt;&lt;/span&gt; extract&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;\1&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; 
&lt;/pre&gt;

&lt;p&gt;So when you say &lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SupportFunction"&gt;helper&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;all&lt;/span&gt;
&lt;/pre&gt; in your controller, the helper-methods of your plugin are not available.&lt;/p&gt;

&lt;p&gt;BUT, ... all the helper modules of your plugin are added to the load_path, so a quick fix for this problem would be to load the helper-module manually&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; for every helper file in your engines:&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SupportFunction"&gt;helper&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;my_plugin_helper&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Then the corresponding module-name is "constantized" and included into ActionView::Base by the "add_template_helper" method:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;file: action_controller/helpers.rb&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;line: 75&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;add_template_helper&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="FunctionArgument"&gt;helper_module&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;:nodoc:&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;     master_helper_module&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;module_eval&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Keyword"&gt;include&lt;/span&gt; helper_module &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;..and all helper-methods of your plugin/engine are available in your views.&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/engines">engines</category>
      <category domain="http://blog.opensteam.net/past/tags/helpers">helpers</category>
      <category domain="http://blog.opensteam.net/past/tags/rails23">rails23</category>
    </item>
    <item>
      <title>Rails + MS SQL on Mac OS X</title>
      <link>http://blog.opensteam.net/past/2009/1/28/rails_ms_sql_on_mac/</link>
      <pubDate>Wed, 28 Jan 2009 20:53:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2009/1/28/rails_ms_sql_on_mac/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;In a recent opensteam project, we had to work with a legacy database on a MS SQL Server 2005.&lt;br /&gt;
Well, connecting rails to a mssql server can be a pain. But after some research we made it work on a windows-client (using the ADO driver) and on a linux (ubuntu) client (using &lt;a href="http://www.unixodbc.org/"&gt;unixODBC&lt;/a&gt; and &lt;a href="http://www.freetds.org"&gt;freetds&lt;/a&gt;), by following the instructions at &lt;a href="http://piao-tech.blogspot.com/2008/02/using-activerecord-with-microsoft-sql.html"&gt;http://piao-tech.blogspot.com/2008/02/using-activerecord-with-microsoft-sql.htm&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Yesterday i wanted to test the connection on my mac and installed unixodbc and freetds via &lt;a href="http://www.macports.org"&gt;MacPorts&lt;/a&gt;, but i always got a "Unexpected EOF from the server" error, when testing the connection-settings with tsql.&lt;/p&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;FreeTDS&lt;/h2&gt;

&lt;p&gt;Turns out, the solution is to install a freetds variant via MacPorts:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; sudo port install freetds &lt;span class="Keyword"&gt;+&lt;/span&gt;msql
&lt;/pre&gt;

&lt;p&gt;which configures freetds with "&amp;mdash;with-tdserv=8.0 &amp;mdash;enable-msdblib".&lt;/p&gt;

&lt;p&gt;And now the connection with tsql works:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; tsql &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="SourceBase"&gt;H&lt;/span&gt; hostname &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="SourceBase"&gt;U&lt;/span&gt; username &lt;span class="Keyword"&gt;-&lt;/span&gt;p port
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; locale is &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;de_AT.UTF-8&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; locale charset is &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;UTF-8&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;Password&lt;/span&gt;&lt;span class="SourceBase"&gt;:&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="Constant"&gt;1&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; we're in!!&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;

&lt;h2&gt;iODBC&lt;/h2&gt;

&lt;p&gt;Now we have to configure ODBC with FreeTDS. Since OSX 10.5 comes pre-installed with iodbc, we make our life simple and use it.&lt;/p&gt;

&lt;p&gt;Edit /Library/ODBC/odbcinst.ini: (mine looks like this)&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="SourceBase"&gt;ODBC&lt;/span&gt; &lt;span class="SourceBase"&gt;Drivers&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; tds &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;Installed&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;tds&lt;span class="SourceBase"&gt;]&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;Driver&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="RegularExpression"&gt;opt&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;local&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libtdsodbc&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;so&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="SourceBase"&gt;Setup&lt;/span&gt;  &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="RegularExpression"&gt;opt&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;local&lt;span class="Keyword"&gt;/&lt;/span&gt;lib&lt;span class="Keyword"&gt;/&lt;/span&gt;libtdsodbc&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;so&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;and /Library/ODBC/odbc.ini&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="SourceBase"&gt;ODBC&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;Trace&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;0&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="SourceBase"&gt;A_DSN&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;Driver&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;TDS&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="SourceBase"&gt;Description&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;ODBC&lt;/span&gt; connection via &lt;span class="SourceBase"&gt;FreeTDS&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="SourceBase"&gt;Trace&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;No&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="SourceBase"&gt;Server&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; hostname_or_ip 
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="SourceBase"&gt;Database&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;DATABASE_NAME&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="SourceBase"&gt;Port&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;1410&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Here we're using a "freetds.conf"-less configuration and specify the server and port directly in the odbc.ini file.
For more configuration settings see &lt;a href="http://cubist.cs.washington.edu/doc/FreeTDS/userguide/x1853.htm"&gt;http://cubist.cs.washington.edu/doc/FreeTDS/userguide/x1853.htm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Now we can test our settings with &lt;b&gt;iodbctest&lt;/b&gt;&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; iodbctest &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;dsn=A_DSN;uid=USERNAME;pwd=PASSWORD&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; iODBC &lt;span class="SourceBase"&gt;Demonstration&lt;/span&gt; program
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;This&lt;/span&gt; program shows an interactive &lt;span class="SourceBase"&gt;SQL&lt;/span&gt; processor
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;Driver&lt;/span&gt; &lt;span class="SourceBase"&gt;Manager&lt;/span&gt;&lt;span class="SourceBase"&gt;:&lt;/span&gt; &lt;span class="Constant"&gt;03.52&lt;/span&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="Constant"&gt;0406.1211&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;Driver&lt;/span&gt;&lt;span class="SourceBase"&gt;:&lt;/span&gt; &lt;span class="Constant"&gt;0.82&lt;/span&gt; &lt;span class="SourceBase"&gt;(&lt;/span&gt;libtdsodbc&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;so&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="SourceBase"&gt;SQL&lt;/span&gt;&lt;span class="Keyword"&gt;&amp;gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; &amp;lt;= In Again!!&lt;/span&gt;
&lt;/pre&gt;

&lt;h2&gt;Rails + ActiveRecord&lt;/h2&gt;

&lt;p&gt;First install some gems:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; sudo gem install dbi dbd&lt;span class="Keyword"&gt;-&lt;/span&gt;odbc
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   sudo gem install rails&lt;span class="Keyword"&gt;-&lt;/span&gt;sqlserver&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2000&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;2005&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;adapter &lt;span class="Keyword"&gt;-&lt;/span&gt;s http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;github&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;com&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Comment"&gt;  &lt;span class="Comment"&gt;#&lt;/span&gt; or&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;   sudo gem install activerecord&lt;span class="Keyword"&gt;-&lt;/span&gt;sqlserver&lt;span class="Keyword"&gt;-&lt;/span&gt;adapter &lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Keyword"&gt;-&lt;/span&gt;source&lt;span class="Keyword"&gt;=&lt;/span&gt;http&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;/&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;gems&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;rubyonrails&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;org&lt;/span&gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Second, install the ruby-odbc bindings from &lt;a href="http://www.ch-werner.de/rubyodbc/"&gt;http://www.ch-werner.de/rubyodbc/&lt;/a&gt;&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; tar xvzf ruby&lt;span class="Keyword"&gt;-&lt;/span&gt;odbc&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;0.9995&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;tar&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;gz&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; cd ruby&lt;span class="Keyword"&gt;-&lt;/span&gt;odbc&lt;span class="Keyword"&gt;-&lt;/span&gt;&lt;span class="Constant"&gt;0.9995&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; ruby extconf&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;rb&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; make
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;&amp;gt;&lt;/span&gt; sudo make install
&lt;/pre&gt;

&lt;p&gt;Third, fire up irb and test if everything is working:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;dbi&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;DBI&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;connect&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;dbi:ODBC:A_DSN&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;USERNAME&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;PWD&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&amp;lt;DBI::DatabaseHandle:0x1200318...&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;And now with ActiveRecord:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;require&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;activerecord&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; h &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;dsn&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;A_DSN&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;password&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;pwd&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;username&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;username&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mode&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;odbc&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;adapter&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;sqlserver&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;ActiveRecord&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;::&lt;/span&gt;&lt;span class="FunctionName"&gt;Base&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;establish_connection&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;h&lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&amp;lt;ActiveRecord::ConnectionAdapters::ConnectionPool:0x183ad50 ..&amp;gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;ActiveRecord&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;::&lt;/span&gt;&lt;span class="FunctionName"&gt;Base&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;connection&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;tables&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;...&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; should display your tables&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;And we have successfully connected Rails to a MS SQL Server!&lt;/p&gt;

&lt;p&gt;Keep in mind to allow tcp/ip connections on your MS SQL Server (Configuration Tools) and allow remote access for your user on the server (Management Tools).&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/database">database</category>
      <category domain="http://blog.opensteam.net/past/tags/legacy">legacy</category>
      <category domain="http://blog.opensteam.net/past/tags/mssql">mssql</category>
      <category domain="http://blog.opensteam.net/past/tags/rails">rails</category>
    </item>
    <item>
      <title>polymorphic controller: nested routes + polymorphic :has_many</title>
      <link>http://blog.opensteam.net/past/2008/11/26/polymorphic_controller_nested_routes_polymorphic/</link>
      <pubDate>Wed, 26 Nov 2008 17:02:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/11/26/polymorphic_controller_nested_routes_polymorphic/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;If you have a polymorphic relationship between models and still want to use nested resources, there is always a problem with accessing the 'parent' context in your nested controller.&lt;/p&gt;

&lt;p&gt;Imagine routes like:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; map&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;resources&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;posts&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;has_many&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;comments&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; map&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;resources&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;articles&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;has_many&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;comments&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;and you get urls like "/posts/:posts&lt;em&gt;id/comments" and "/articles/:articles&lt;/em&gt;id/comments".
The problem now is to determine the comment-context in your comments_controller.rb.
If you only have two "parent" controller an "if-else" statement is a simple solution:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;CommentsController&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; ApplicationController&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;index&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;if&lt;/span&gt; params&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;articles_id&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;      &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;@&lt;/span&gt;context&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;Article&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; params&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;articles_id&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="SourceBase"&gt;      &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;@&lt;/span&gt;context&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;Post&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; params&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;post_id&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;@&lt;/span&gt;comments&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;@&lt;/span&gt;context&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;comments&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;But what if you have more polymorphic models and don't want to write an else-clause for every one of it?
One solution is to define some "parent resources" in the comments_controller, as described here: &lt;a href="http://revolutiononrails.blogspot.com/2007/05/drying-up-polymorphic-controllers.html"&gt;http://revolutiononrails.blogspot.com/2007/05/drying-up-polymorphic-controllers.html&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Another solution is to use the routes definition directly, using the (not so well documented) :requirements option:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; map&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;resources&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;articles&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;has_many&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;comments&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;requirements&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;context_type&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;articles&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;unfortunately this definition just creates the :context_type parameter for the :articles resource and not for the nested one:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; Routes Example:&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="RegularExpression"&gt;articles&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;id&lt;/span&gt;    &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;controller&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;articles&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;action&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;show&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;context_type&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;articles&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="RegularExpression"&gt;articles&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;id&lt;/span&gt;&lt;span class="Keyword"&gt;/&lt;/span&gt;comments   &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;controller&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;comments&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt;action &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;show&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;We have to be more explicit about the nested resource:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; map&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;resources&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;articles&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;articles&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   articles&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;resources&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;requirements&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;context_type&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;articles&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;This actually does the same as the :has_many option, but now we can define the &lt;em&gt;required&lt;/em&gt; context type parameter directly on the nested resource.&lt;/p&gt;

&lt;p&gt;And now, in your controller, you can access the context model dynamically:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;CommentsController&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; ApplicationController&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;index&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;@&lt;/span&gt;comments&lt;/span&gt; &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="FunctionName"&gt;context_object&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;include&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;comments&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;comments&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Comment"&gt;    &lt;span class="Comment"&gt;#&lt;/span&gt;...&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;private&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;context_object&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="FunctionArgument"&gt; &lt;span class="Keyword"&gt;*&lt;/span&gt;finder_options &lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="SourceBase"&gt;    params&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;context_type&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;classify&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;constantize&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; context_id&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Keyword"&gt;*&lt;/span&gt;finder_options &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;context_id&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt; &lt;span class="SourceBase"&gt;    params&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;#{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;params&lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;context_type&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;_id&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;the downside: for every polymorphic resource you have to define the :requirements option in your routes.&lt;br /&gt;
But i guess there is no way around this, except parsing the params hash for an "*_id" key, constantize the result and hoping nothing goes wrong and everyone respects the naming convention.&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/development">development</category>
      <category domain="http://blog.opensteam.net/past/tags/rails">rails</category>
      <category domain="http://blog.opensteam.net/past/tags/routes">routes</category>
      <category domain="http://blog.opensteam.net/past/tags/ruby">ruby</category>
    </item>
    <item>
      <title>Namespaced Controller - get all sub-controller</title>
      <link>http://blog.opensteam.net/past/2008/11/19/namespaced_controller_get_all_subcontroller/</link>
      <pubDate>Wed, 19 Nov 2008 18:52:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/11/19/namespaced_controller_get_all_subcontroller/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;Let's say we have a pretty big rails application with lots of namespaced controller like:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;AdminController&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; ApplicationController&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;Admin::UsersController&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; AdminController&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;Admin::PostsController&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; AdminController&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;...and so on.&lt;/p&gt;

&lt;p&gt;Now we want to build a method to get all subcontroller of a given controller, so that we can say:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;AdminController&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;subcontroller&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; [Admin::UsersController, Admin::PostsController]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;For every namespaced controller, rails builts a module with the controller-name (without "Controller") for the sub-controller.&lt;/p&gt;

&lt;p&gt;So, we add a class method to AdminController:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;&lt;span class="TypeName"&gt;&lt;span class="TypeName"&gt;&amp;lt;&amp;lt;&lt;/span&gt; self&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;subcontroller&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="SourceBase"&gt;self&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;to_s&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;=~&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span class="RegularExpression"&gt;^&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;(&lt;/span&gt;.+&lt;span class="RegularExpression"&gt;)&lt;/span&gt;&lt;/span&gt;Controller$&lt;/span&gt;&lt;span class="RegularExpression"&gt;&lt;span class="RegularExpression"&gt;/&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;return&lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt; &lt;span class="Keyword"&gt;unless&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="SourceBase"&gt;    mod &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="SourceBase"&gt;    smod &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;$&lt;/span&gt;1&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;demodulize&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;if&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; pmod &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;self&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;parent&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;const_defined?&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&amp;quot;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;#{&lt;/span&gt;smod&lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class="Constant"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt; &lt;span class="SourceBase"&gt;      &lt;span class="Keyword"&gt;return&lt;/span&gt; &lt;span class="SourceBase"&gt;(&lt;/span&gt; mod &lt;span class="Keyword"&gt;=&lt;/span&gt; mod&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;constantize&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;constants&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;reject&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;r&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt; &lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="SourceBase"&gt;        &lt;span class="Keyword"&gt;!&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; mod&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;const_get&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; r &lt;span class="SourceBase"&gt;)&lt;/span&gt; &lt;span class="Keyword"&gt;&amp;lt;&lt;/span&gt; &lt;span class="SourceBase"&gt;ActionController&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;::&lt;/span&gt;&lt;span class="FunctionName"&gt;Base&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="SourceBase"&gt;      &lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt; &lt;span class="SourceBase"&gt;    &lt;span class="Keyword"&gt;return&lt;/span&gt; &lt;span class="SourceBase"&gt;[&lt;/span&gt;&lt;span class="SourceBase"&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Looks complicated, so lets get through this:&lt;br /&gt;
First we get the module name of the current controller( "AdminController" =&gt; "Admin" ).&lt;br /&gt;
Then we check if the constant ("Admin") is defined and, if it is, we return all constants/classes of this module that inherit from &lt;b&gt;ActionController::Base&lt;/b&gt;, thus being a controller class.&lt;br /&gt;
If the module is not defined, we return an empty array, no subcontroller.&lt;/p&gt;

&lt;p&gt;(All this "const_get(..)" stuff is used for more nested controllers, like "Admin::System::Config::PostsController".)&lt;/p&gt;

&lt;p&gt;Now all the ruby-geeks out there are screaming "&lt;i&gt;way too complicated! why not use this:&lt;/i&gt;"&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;Object&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;subclasses_of&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="SourceBase"&gt;AdminController&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt; =&amp;gt; [Admin::UsersController, Admin::PostsController]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;..and this works too. But keep in mind that the &lt;b&gt;Object#subclasses_of&lt;/b&gt; method cycles through the whole ObjectSpace, trying to find an inherited class.&lt;/p&gt;

&lt;p&gt;A little benchmark test on script/console:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; n &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="Constant"&gt;5000&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;5000&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;Benchmark&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;bm&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;x&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="Constant"&gt;?&amp;gt;&lt;/span&gt; x&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;report&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;n&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;times&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="SourceBase"&gt;AdminController&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;subcontroller&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; x&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;report&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;n&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;times&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="SourceBase"&gt;Object&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;subclasses_of&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="SourceBase"&gt;AdminController&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt; &lt;span class="Keyword"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;       user     system      total        real
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;   &lt;span class="Constant"&gt;0.310000&lt;/span&gt;   &lt;span class="Constant"&gt;0.000000&lt;/span&gt;   &lt;span class="Constant"&gt;0.310000&lt;/span&gt; &lt;span class="SourceBase"&gt;(&lt;/span&gt;  &lt;span class="Constant"&gt;0.312271&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;  &lt;span class="Constant"&gt;61.190000&lt;/span&gt;   &lt;span class="Constant"&gt;0.280000&lt;/span&gt;  &lt;span class="Constant"&gt;61.470000&lt;/span&gt; &lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="Constant"&gt;62.760276&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;.. so the &lt;b&gt;subcontroller&lt;/b&gt; method, using &lt;b&gt;Module#constants&lt;/b&gt;, is a little bit faster..&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/benchmark">benchmark</category>
      <category domain="http://blog.opensteam.net/past/tags/controller">controller</category>
      <category domain="http://blog.opensteam.net/past/tags/development">development</category>
      <category domain="http://blog.opensteam.net/past/tags/rails">rails</category>
      <category domain="http://blog.opensteam.net/past/tags/ruby">ruby</category>
    </item>
    <item>
      <title>register ActionMailer methods into Database</title>
      <link>http://blog.opensteam.net/past/2008/11/12/register_actionmailer_into_database/</link>
      <pubDate>Wed, 12 Nov 2008 19:42:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/11/12/register_actionmailer_into_database/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;In the last posting, we talked about an &lt;a href="http://blog.opensteam.net/past/2008/11/10/check_active_actionmailer/"&gt;ActionMailer active-check&lt;/a&gt;. For this approach to work, we need to register all instance-methods of all ActionMailer classes of our rails-app into the database.&lt;/p&gt;

&lt;p&gt;The commonly used solution for this task is to search through your &lt;b&gt;app/models&lt;/b&gt; directory, &lt;i&gt;require&lt;/i&gt; all the *_mailer.rb classes and save them to the database. Like this:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;Dir&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;glob&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="String"&gt;&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;#{&lt;/span&gt;&lt;span class="SourceBase"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;/app/models/*_mailer.rb&lt;span class="String"&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;each&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;file&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   klass &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;File&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;basename&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; file&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="String"&gt;&lt;span class="String"&gt;'&lt;/span&gt;.rb&lt;span class="String"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;classify&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;constantize&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   klass&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;instance_methods&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;false&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;each&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;meth&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;     &lt;span class="SourceBase"&gt;SystemMailer&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;find_or_create_by_mailer_class_and_mailer_method&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_class&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; klass&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;to_s&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_method&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; meth&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;     &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Put this into an initializer or your environment.rb file and you'r good to go.
The downfall of this solution: You have to know all the directories of your Mailer classes, which might not be a problem, if you're following the "convention-over-configuration" rule inside your rails-app.&lt;/p&gt;

&lt;p&gt;Another approach might be to get all subclasses of ActionMailer::Base:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;ActionMailer&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;::&lt;/span&gt;&lt;span class="FunctionName"&gt;Base&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;subclasses_of&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="SourceBase"&gt;ActionMailer&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;::&lt;/span&gt;&lt;span class="FunctionName"&gt;Base&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;each&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;klass&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   klass&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;instance_methods&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="Constant"&gt;false&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;each&lt;/span&gt;&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;meth&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;     &lt;span class="SourceBase"&gt;SystemMailer&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;find_or_create_by_mailer_class_and_mailer_method&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_class&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; klass&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;to_s&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_method&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; meth&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;     &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;But this only works, if the subclasses of ActionMailer::Base are fully loaded/required (which is not the case, if your server just starts up).&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/development">development</category>
      <category domain="http://blog.opensteam.net/past/tags/rails">rails</category>
      <category domain="http://blog.opensteam.net/past/tags/ruby">ruby</category>
    </item>
    <item>
      <title>check active ActionMailer</title>
      <link>http://blog.opensteam.net/past/2008/11/10/check_active_actionmailer/</link>
      <pubDate>Mon, 10 Nov 2008 21:01:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/11/10/check_active_actionmailer/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;In the openSteam backend, we wanted to give the admins the possibility to manually activate or deactivate mailer, like order-confirmation or user-signup mails.&lt;/p&gt;

&lt;p&gt;We built a model, called SystemMailer, which holds the mailer classname, the mailer method and a boolean.&lt;/p&gt;

&lt;p&gt;Migration File:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;CreateSystemMailer&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Migration&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt;   &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;self.up&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;     create_table &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;system_mailers&lt;/span&gt; &lt;span class="Keyword"&gt;do &lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;&lt;span class="SourceBase"&gt;t&lt;/span&gt;&lt;span class="SourceBase"&gt;|&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;       t&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;string&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_method&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;       t&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;string&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_class&lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;       t&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;boolean&lt;/span&gt;&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;       t&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;timestamps&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt;     &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;   &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;self.down&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;     drop_table &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;system_mailers&lt;/span&gt;
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Model:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;SystemMailer&lt;span class="ClassInheritance"&gt; &lt;span class="ClassInheritance"&gt;&amp;lt;&lt;/span&gt; ActiveRecord::Base&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; &lt;span class="SourceBase"&gt;  &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;active?&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="SourceBase"&gt;self&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;active&lt;/span&gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;;&lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;&lt;span class="Comment"&gt;&lt;span class="Comment"&gt;#&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt; &lt;span class="SourceBase"&gt;  named_scope &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;conditions&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;&lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;/span&gt;&lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Then we built an &lt;b&gt;alias method chain&lt;/b&gt; for the ActionMailer::Base#deliver! method, to check whether the current mail-method of the current mailer is active:&lt;/p&gt;

&lt;pre class="all_hallows_eve"&gt;&lt;span class="line-numbers"&gt;   1 &lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;class&lt;/span&gt; &lt;span class="TypeName"&gt;ActionMailer::Base&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   2 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;   3 &lt;/span&gt;   &lt;span class="SourceBase"&gt;&lt;span class="Keyword"&gt;def&lt;/span&gt; &lt;span class="FunctionName"&gt;deliver_with_active_mailer_check!&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt;&lt;span class="FunctionArgument"&gt;mail&lt;/span&gt;&lt;span class="SourceBase"&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;   4 &lt;/span&gt;     active_mailer &lt;span class="Keyword"&gt;=&lt;/span&gt; &lt;span class="SourceBase"&gt;SystemMailer&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;find&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;all&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   5 &lt;/span&gt;       &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;conditions&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;{&lt;/span&gt;&lt;span class="SourceBase"&gt; &lt;/span&gt;
&lt;span class="line-numbers"&gt;   6 &lt;/span&gt;         &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_class&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;self&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;class&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;to_s&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   7 &lt;/span&gt;         &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;mailer_method&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;@&lt;/span&gt;template&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt;
&lt;span class="line-numbers"&gt;   8 &lt;/span&gt;         &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active&lt;/span&gt; &lt;span class="SourceBase"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="Constant"&gt;true&lt;/span&gt; &lt;span class="SourceBase"&gt;}&lt;/span&gt; &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;   9 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  10 &lt;/span&gt;     &lt;span class="Keyword"&gt;return&lt;/span&gt; &lt;span class="Constant"&gt;nil&lt;/span&gt; &lt;span class="Keyword"&gt;if&lt;/span&gt; active_mailer&lt;span class="SourceBase"&gt;&lt;span class="SourceBase"&gt;.&lt;/span&gt;&lt;span class="FunctionName"&gt;empty?&lt;/span&gt;&lt;/span&gt;
&lt;span class="line-numbers"&gt;  11 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  12 &lt;/span&gt;     &lt;span class="SourceBase"&gt;&lt;span class="FunctionName"&gt;deliver_without_active_mailer_check!&lt;/span&gt;&lt;/span&gt;&lt;span class="SourceBase"&gt;(&lt;/span&gt; mail &lt;span class="SourceBase"&gt;)&lt;/span&gt;
&lt;span class="line-numbers"&gt;  13 &lt;/span&gt;   &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;span class="line-numbers"&gt;  14 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  15 &lt;/span&gt;   alias_method_chain &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;deliver!&lt;/span&gt;&lt;span class="SourceBase"&gt;,&lt;/span&gt; &lt;span class="Constant"&gt;&lt;span class="Constant"&gt;:&lt;/span&gt;active_mailer_check&lt;/span&gt;
&lt;span class="line-numbers"&gt;  16 &lt;/span&gt; 
&lt;span class="line-numbers"&gt;  17 &lt;/span&gt; &lt;span class="Keyword"&gt;end&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;In this alias-method, we try to fetch an active SystemMailer entry (with the current class and method name).
If the results are empty (no active SystemMailer found), we return nil, otherwise we call the original &lt;b&gt;deliver!&lt;/b&gt; method. Pretty simple.&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/code">code</category>
      <category domain="http://blog.opensteam.net/past/tags/development">development</category>
      <category domain="http://blog.opensteam.net/past/tags/rails">rails</category>
      <category domain="http://blog.opensteam.net/past/tags/ruby">ruby</category>
    </item>
    <item>
      <title>Accessible Rich Internet Applications @ access-see-be.net</title>
      <link>http://blog.opensteam.net/past/2008/10/15/accessible_rich_internet_applications_accessseebenet/</link>
      <pubDate>Wed, 15 Oct 2008 16:07:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/10/15/accessible_rich_internet_applications_accessseebenet/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;Alexander Gewessler, a co-developer and friend @ &lt;a href="http://www.diamonddogs.cc"&gt;diamonddogs&lt;/a&gt;, has released a javascript library for "accessible rich internet application", based on the &lt;a href="http://www.w3.org/TR/wai-aria/"&gt;WAI-ARIA&lt;/a&gt; working draft from the W3C.&lt;/p&gt;

&lt;p&gt;From his website: &lt;br /&gt;
&lt;i&gt;Embedding Accessibility in Rich Internet Applications is of great importance for achieving the goal of Universal Design, the approach to design products that can be used by all people without the need for adaptation or specialization.&lt;/i&gt;&lt;/p&gt;

&lt;p&gt;Website: &lt;a href="http://www.access-see-be.net"&gt;www.access-see-be.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The source is also available at &lt;a href="http://github.com/ohneworte/access.see.be/tree/master"&gt;github&lt;/a&gt;.&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/development">development</category>
      <category domain="http://blog.opensteam.net/past/tags/javascript">javascript</category>
    </item>
    <item>
      <title>v0.9.3 released!</title>
      <link>http://blog.opensteam.net/past/2008/10/1/v093_released/</link>
      <pubDate>Wed, 01 Oct 2008 19:46:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/10/1/v093_released/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;We finally released a new version of openSteam today.&lt;/p&gt;

&lt;p&gt;This release introduces some major enhancements of the checkout- and order-process, like shipping-rate calculation, tax management and an ActiveMerchant integration for credit-card payments.&lt;/p&gt;

&lt;p&gt;New Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Taxes: define taxes or tax-groups for products and regions&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.activemerchant.org/"&gt;ActiveMerchant&lt;/a&gt; integration&lt;/li&gt;
&lt;li&gt;PaymentMethods: use implemented payment-methods or implement your own&lt;/li&gt;
&lt;li&gt;ShippingRate: define rates for products, regions and payment-types.&lt;/li&gt;
&lt;li&gt;PDF-Export for invoices (using the excellent &lt;a href="http://www.cracklabs.com/prawnto"&gt;prawnto&lt;/a&gt; plugin)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a full list of changes please read the CHANGELOG, and if you're curious what to expect in future releases, please visit the &lt;a href="http://opensteam.net/Roadmap.ashx"&gt;Roadmap&lt;/a&gt; at our homepage.&lt;/p&gt;

&lt;p&gt;In future posts we will try to describe some of the new features and their implementations in detail.&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/code">code</category>
      <category domain="http://blog.opensteam.net/past/tags/release">release</category>
    </item>
    <item>
      <title>openSteam v0.9.2 released!</title>
      <link>http://blog.opensteam.net/past/2008/8/7/opensteam_v092_released/</link>
      <pubDate>Thu, 07 Aug 2008 14:32:00 GMT</pubDate>
      <guid>http://blog.opensteam.net/past/2008/8/7/opensteam_v092_released/</guid>
      <author>notyce@gmail.com (michael.schaerfer)</author>
      <description>&lt;p&gt;A new opensteam version is released to the world.
This release fixes some bugs in the product-generators and admin-controller.&lt;/p&gt;

&lt;p&gt;New Features:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Apply filter to the sortable tables (admin-backend)&lt;/li&gt;
&lt;li&gt;SQLite3 compatibility&lt;/li&gt;
&lt;li&gt;RESTful controller (admin-backend)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And we want to thank Gregg and Jason from &lt;a href="http://railsenvy.com"&gt;railsenvy.com&lt;/a&gt; for mentioning opensteam in their newest &lt;a href="http://railsenvy.com/2008/8/6/rails-envy-podcast-episode-041-08-06-2008"&gt;podcast&lt;/a&gt;.&lt;/p&gt;</description>
      <category domain="http://blog.opensteam.net/past/tags/release">release</category>
    </item>
  </channel>
</rss>
