<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Synthesis: RoR Grid Control Part II</title>
    <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>by Scott Becker</description>
    <item>
      <title>RoR Grid Control Part II</title>
      <description>&lt;p&gt;My reusable &amp;#8220;grid control&amp;#8221; with paging and filtering is almost finished. I made some changes to the syntax, and I converted the whole thing to a component, so it can simply be dropped in the components directory of a rails app and used as is.&lt;/p&gt;


	&lt;p&gt;Defining the columns is very &lt;span class="caps"&gt;DRY&lt;/span&gt;, the minimum thing you have to specify for each column is a title. From this the component will guess the actual database column to be the same (with spaces converted to underscores). If your database column name is different, you can specify that.&lt;/p&gt;


	&lt;p&gt;I also added some display format options, including &amp;#8220;email&amp;#8221;, &amp;#8220;website&amp;#8221; and &amp;#8220;money&amp;#8221; and &amp;#8220;date&amp;#8221;. These will make the columns look and behave as you would expect.&lt;/p&gt;


	&lt;p&gt;Here&amp;#8217;s what the code to call it looks like now:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;my_controller_method&lt;/span&gt;
    &lt;span class="ident"&gt;grid_html&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;render_component_as_string&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:controller&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;controls/grid&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;grid&lt;/span&gt;&lt;span class="punct"&gt;',&lt;/span&gt;
      &lt;span class="symbol"&gt;:params&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;
        &lt;span class="symbol"&gt;:model&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
        &lt;span class="symbol"&gt;:obj&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:obj&lt;/span&gt;&lt;span class="punct"&gt;],&lt;/span&gt;
        &lt;span class="symbol"&gt;:columns&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt;
          &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Category&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:db_column&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;category_name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:select&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_column&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;category_id&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_options&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Category&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;find&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:order&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;name ASC&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;).&lt;/span&gt;&lt;span class="ident"&gt;collect&lt;/span&gt; &lt;span class="punct"&gt;{|&lt;/span&gt;&lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="punct"&gt;[&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;name&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;c&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt; &lt;span class="punct"&gt;]&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
          &lt;span class="punct"&gt;},&lt;/span&gt;
          &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt; &lt;span class="punct"&gt;},&lt;/span&gt;
          &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Published&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:select&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_options&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;published_options&lt;/span&gt;
          &lt;span class="punct"&gt;},&lt;/span&gt;
          &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Featured&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_type&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:select&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;
             &lt;span class="symbol"&gt;:filter_options&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;Product&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;featured_options&lt;/span&gt;
          &lt;span class="punct"&gt;},&lt;/span&gt;
          &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Retail&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
             &lt;span class="symbol"&gt;:db_column&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;retail_price&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
             &lt;span class="symbol"&gt;:format&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:money&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; 
             &lt;span class="symbol"&gt;:filter&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:false&lt;/span&gt; 
          &lt;span class="punct"&gt;},&lt;/span&gt;
          &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="symbol"&gt;:title&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Stock&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
             &lt;span class="symbol"&gt;:db_column&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;in_stock&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; 
             &lt;span class="symbol"&gt;:filter&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:false&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
        &lt;span class="punct"&gt;],&lt;/span&gt;
        &lt;span class="symbol"&gt;:joins&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;LEFT OUTER JOIN categories ON products.category_id = categories.id&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;],&lt;/span&gt;
        &lt;span class="symbol"&gt;:alias_columns&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;[[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;categories.name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;category_name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;]],&lt;/span&gt;
        &lt;span class="symbol"&gt;:order_by&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;category_name, products.name&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;,&lt;/span&gt;
        &lt;span class="symbol"&gt;:per_page&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="number"&gt;25&lt;/span&gt;
      &lt;span class="punct"&gt;})&lt;/span&gt;
    &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:text&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;grid_html&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:layout&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Once I get everything reasonably ironed out and add a few more things like sorting, I plan to open source this code&amp;#8230;&lt;/p&gt;


	&lt;p&gt;Again, here is what mine looks like. This could easily be customized to look any way you want, by simply modifying the view rhtml file:&lt;/p&gt;


	&lt;p&gt;&lt;a href="http://www.sbecker.net/images/grid_view.gif"&gt;&lt;img src="http://www.sbecker.net/images/grid_view_small.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;</description>
      <pubDate>Wed, 03 Aug 2005 01:52:00 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:cb9405506fd77f024309cc491ae6d1f7</guid>
      <author>sbecker</author>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii</link>
      <category>Ruby on Rails</category>
      <category>Web Development</category>
    </item>
    <item>
      <title>"RoR Grid Control Part II" by Omer Raviv</title>
      <description>Just another vote for releasing this to the public :) It looks spectecular. Open sourcing it and allowing people to offer patched\improvements\comments should make it even more so.

Please, please, gimme! :)</description>
      <pubDate>Wed, 08 Feb 2006 10:21:44 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii#comment-30</link>
    </item>
    <item>
      <title>"RoR Grid Control Part II" by Adrian Madrid</title>
      <description>Me too! Please let us know where you are at and if you are releasing it.

Thanks!

AEM</description>
      <pubDate>Tue, 07 Feb 2006 15:28:05 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii#comment-29</link>
    </item>
    <item>
      <title>"RoR Grid Control Part II" by Bryan</title>
      <description>Just wondering where this project is at... I'd like to use it :)</description>
      <pubDate>Tue, 17 Jan 2006 08:17:36 -0800</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii#comment-25</link>
    </item>
    <item>
      <title>"RoR Grid Control Part II" by scott</title>
      <description>ntollervey - err, soon! i need to modify the paging buttons to pass along any filtering parameters, and then it should basically work 100%. as to where, here will be a good place to look im sure!

Stuart - awesome, thanks for the IIS tips, I'll have to try that! yes, ajax for in place editing, i like that idea... hmm, shouldn't actually be too hard...</description>
      <pubDate>Wed, 14 Sep 2005 06:39:10 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii#comment-24</link>
    </item>
    <item>
      <title>"RoR Grid Control Part II" by Stuart Johnson</title>
      <description>great effort!  This sort of thing had been on my wishlist since I started looking at Rails seriously.  A cool next step once the core functionality is in place would be to add Ajax for an edit in place data grid (!) ...

ps - if you're still having problems with IIS and Rails, I've posted some possible fixes in a response to 
&lt;a href="http://rubyforiis.sosukodo.org/rubyforiis/feedback/unabletoconnecttofastcgiserver"&gt;http://rubyforiis.sosukodo.org/rubyforiis/feedback/unabletoconnecttofastcgiserver&lt;/a&gt;</description>
      <pubDate>Wed, 07 Sep 2005 15:31:50 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii#comment-23</link>
    </item>
    <item>
      <title>"RoR Grid Control Part II" by ntollervey</title>
      <description>Just wondering how this project was progressing. It looks like its exactly what I need for a current RoR project. When (and where) will this code be released?
</description>
      <pubDate>Tue, 30 Aug 2005 14:40:39 -0700</pubDate>
      <guid isPermaLink="false">urn:uuid:</guid>
      <link>http://synthesis.sbecker.net/articles/2005/08/03/ror-grid-control-part-ii#comment-22</link>
    </item>
  </channel>
</rss>
