<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>2dconcept - Ruby on Rails</title>
    <link>http://www.2dconcept.com</link>
    <description>Description in english</description>
    <language>en</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/2dc_EN" type="application/rss+xml" /><feedburner:browserFriendly></feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Reverse scaffold an existing table</title>
      <description>&lt;p&gt;If like me you are used to work with existing database schemas, the &lt;a href="http://github.com/ahe/reverse_scaffold" target="_blank"&gt;reverse_scaffold script&lt;/a&gt; should be interesting for you.&lt;p&gt;
&lt;br&gt;&lt;p&gt;Just &lt;a href="http://github.com/ahe/reverse_scaffold" target="_blank"&gt;download&lt;/a&gt; it from GitHub and copy the file into the "script" folder of your Ruby on Rails application.
&lt;br&gt;  &lt;br/&gt;You can then execute it from your terminal :
&lt;br&gt;  &lt;br/&gt;$ ruby script/reverse_scaffold users user
&lt;br&gt;&lt;p&gt;
&lt;br&gt;&lt;p&gt;For this example I presume you have an existing "users" table in your database described by the following columns :
&lt;br&gt;  &lt;ul&gt;
&lt;br&gt;    &lt;li&gt;id&lt;/li&gt;
&lt;br&gt;    &lt;li&gt;pseudo&lt;/li&gt;
&lt;br&gt;    &lt;li&gt;email&lt;/li&gt;
&lt;br&gt;    &lt;li&gt;password&lt;/li&gt;
&lt;br&gt;  &lt;/ul&gt;
&lt;br&gt;&lt;/p&gt;
&lt;br&gt;&lt;p&gt;
&lt;br&gt;  In this case, the script will execute the command :
&lt;br&gt;  &lt;br/&gt;ruby script/generate scaffold user --skip-migration id:integer pseudo:string email:string password:string
&lt;br&gt;&lt;/p&gt;
&lt;br&gt;&lt;p&gt;As you understood, the first argument represents the name of the table and the second one is the name of the model to generate.&lt;/p&gt;
&lt;br&gt;&lt;p&gt;You can use the -V option if you don't want to execute the scaffold but just display the generated command.
&lt;br&gt;  &lt;br/&gt;If you are an RSpec adept, you can specify the -r option and rspec_scaffold will then be used.
&lt;br&gt;&lt;/p&gt;
&lt;br&gt;&lt;p&gt;
&lt;br&gt;  For more information :
&lt;br&gt;  &lt;br/&gt;$ ruby script/reverse_scaffold -h
&lt;br&gt;&lt;/p&gt;
&lt;br&gt;</description>
      <author>Anthony Heukmes</author>
      <pubDate>Tue, 04 Aug 2009 15:23:38 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/11-reverse-scaffold-existing-table</link>
      <guid>http://www.2dconcept.com/articles/11-reverse-scaffold-existing-table</guid>
    </item>
    <item>
      <title>A successful story of Ruby on Rails in the enterprise</title>
      <description>Robert Martin gave a excellent keynote at RailsConf 09 "What killed Smalltalk could kill Ruby too" where he enforced that Rails must open his doors to the external world's needs.
&lt;br&gt;There are a lot of good practices and conventions in the Ruby and Rails community and I really think it's the best framework for web development.
&lt;br&gt;But our practices are not respected everywhere. Other people have different needs/visions and Rails should be a good solution for them too.
&lt;br&gt;
&lt;br&gt;A simple example is related to primary keys. By default, database tables of a Rails application contain an auto-incremented ID acting like a primary key.
&lt;br&gt;In his base version, Rails doesn't support composite primary keys. A plugin exists to add this functionality but it's not a core feature of ActiveRecord.
&lt;br&gt;If you ask Rails fanatics for the reason of a such choice, they will tell you that composite primary keys is not a good practice and you should avoid them!
&lt;br&gt;Unfortunately, those primary keys are everywhere in the professional world where a lot of big Oracle schemas don't respect our conventions. And they will of course not change to adapt to a new framework.
&lt;br&gt;
&lt;br&gt;Rails have to adapt to that kind of needs if we want it to be a competitive choice for the enterprise.
&lt;br&gt;And happily, Rails is more and more enterprise ready version after version.
&lt;br&gt;
&lt;br&gt;I recently managed to integrate Rails in a big company which was only using Java. The goal of this article is to share the difficulties I met during the process. I hope it will maybe help you to accomplish the same "exploit" and make your dream comes true : using Rails on a daily basis! 
&lt;br&gt;
&lt;br&gt;Rails development on a legacy Oracle schema was my main fear. Until that day, my schema was always evolving with my Rails application and so, it was following the ActiveRecord conventions.
&lt;br&gt;However, I rapidly discovered that it was easy as pie to configure an AR model to override these conventions. You can read &lt;a href="http://www.2dconcept.com/articles/2-rails-legacy-db-activerecord-conventions" target="_blank"&gt;my blog post on this subject&lt;/a&gt;. Executing stored procedures and other kind of boring stuff is also a piece of cake.
&lt;br&gt;
&lt;br&gt;The scripting language term is scary for most people, mainly because of the slowliness idea associated to it.
&lt;br&gt;Do not hesitate to reassure your customers by showing them many high traffic websites using Rails and enforcing that they don't encounter performance issues. &lt;a href="http://rails100.pbworks.com/Compete+Rankings" target="_blank"&gt;Here is a list&lt;/a&gt; that will help you in this task&lt;/a&gt;.
&lt;br&gt;Another argument to bring to light is JRuby on Rails. I think it's a great solution to integrate Rails more easily in the enterprise. Customers are very happy to learn that Rails can run on the JVM and that they will not totally leave the J2EE world.
&lt;br&gt;
&lt;br&gt;Ruby and Rails skills is another major problem. If you suggest a new Java framework, chances are big that it will be accepted very easily. All developers in the company already know Java! But almost nobody knows Ruby and that means they will loose time because of the learning curve! And don't forget that many developers are not passionate by their job, they don't want to learn new technologies! Add to this the fact that it's already difficult to hire a good Java developer... how hard will it be to find Rubyists?
&lt;br&gt;
&lt;br&gt;I personaly got rid of these fears by demonstrating how Ruby and Rails are easy to learn. Take the necessary time to prepare an attractive training during which you will share your excitement and your passion for this technology. I gave trainings to my colleagues and they quickly discovered Rails' benefits and how easy it is to learn. Most of my co-workers were then blowing the merits of Rails and I wasn't the only one to fight anymore.
&lt;br&gt;"Awesome" was on every mouthes when my colleagues started their first test applications using our wonderful framework. What a pleasure to see their smiling faces!
&lt;br&gt;I also compared pieces of Java and Ruby code if front of a customer so he can realize how Ruby syntax is clear and easy. And so, how Rails applications are easier to maintain over time.
&lt;br&gt;
&lt;br&gt;Another issue is Rails development on Windows. I'm personally working on a Mac but I'm the only one.
&lt;br&gt;We tried Aptana and Netbeans but it was clearly not a good solution. Happily, &lt;a href="http://www.jetbrains.com/ruby/index.html" target="_blank"&gt;RubyMine&lt;/a&gt; released an excellent IDE. You have to try it!
&lt;br&gt;A big problem is that Windows is even used for deployment. And we all know that deploying a Rails application on Windows is a pain in the ass. Plus, tools to monitor and deploy Rails applications are considered as toys compared to the powerful Java tools. One more time, I think that JRuby can be the perfect solution. The &lt;a href="http://caldersphere.rubyforge.org/warbler/"&gt;warbler&lt;/a&gt; utility makes it possible to create a war file from a Rails application. Once you have that, you can easily deploy your app on any J2EE application server. I'll talk about that in a next article.
&lt;br&gt;
&lt;br&gt;The enterprise word is very often associated with portal. So a natural question is : "Is it possible to integrate a Rails application in a portlet?". I never personally tried but I read that it's possible to achieve. 
&lt;br&gt;
&lt;br&gt;The Java framework (Oracle ADF) that had been used since now by our customer was based on JSF so users were used to rich components like datagrids with sorting, pagination, etc. The kind of stuff we don't have out of the box with Rails. That why I created &lt;a href="http://www.2dconcept.com/jquery-grid-rails-plugin"&gt;a Rails plugin&lt;/a&gt; based on jQuery to create full featured datagrids with just a few lines of code.
&lt;br&gt;
&lt;br&gt;Finally, I will finish this article by giving a few arguments that convinced my customers.
&lt;br&gt;
&lt;br&gt;RSpec was very appreciated! I simulated a failing test and the autotest-growl combo made a good impression.
&lt;br&gt;Specs generation at the doc format was also an interesting point.
&lt;br&gt;I was not using Cucumber at that time but I'm sure that it will impress too! 
&lt;br&gt;
&lt;br&gt;I aslo created a &lt;a href="http://m.onkey.org/2008/12/4/rails-templates"&gt;template&lt;/a&gt; for new projects creation. It contains the company layout (css, images, ...) and other shared functionalities. The possibility to generate a new application with just one command line was very appreciated.
&lt;br&gt;
&lt;br&gt;Do not hesitate to share your experiences... I'll be happy to read them!</description>
      <author>Anthony Heukmes</author>
      <pubDate>Fri, 29 May 2009 11:36:56 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/10-rails-in-the-entreprise</link>
      <guid>http://www.2dconcept.com/articles/10-rails-in-the-entreprise</guid>
    </item>
    <item>
      <title>EdgeRails : rack router, protect_from_forgery &amp; modules dependencies</title>
      <description>The way towards Rails 3 is going on and you can find a lot of activity on GitHub these days.
&lt;br&gt;
&lt;br&gt;First good news, Carl Lerche &amp; Josh Peek are working on &lt;a href="http://github.com/carllerche/rack-router/tree/master" target="_blank"&gt;a new router&lt;/a&gt; (a Rack middleware, so it will not be only useful for Rails). According to Carl, &lt;a href="http://gist.github.com/96279" target="_blank"&gt;performances are 2x faster than Merb router&lt;/a&gt; (and so, 4 times faster than Rails).
&lt;br&gt;
&lt;br&gt;More information available on &lt;a href="http://groups.google.com/group/rack-devel/browse_thread/thread/41334bce83cb173f" target="_blank"&gt;Rack GG group&lt;/a&gt;.
&lt;br&gt;
&lt;br&gt;Another good news, &lt;a href="http://github.com/rails/rails/commit/256b0ee8e3c1610967dfc89f864e24b98ed3c236" target="_blank"&gt;we will not have to add authenticity tokens to our hand-written Ajax requests anymore&lt;/a&gt;!
&lt;br&gt;You know, when you create a Javascript function that sends a POST request to your server and you get a nice "Invalid Authenticity Token" error message in return.
&lt;br&gt;The solution is to add the token to your parameters or to disable CSRF attacks check in your controller using protect_from_forgery :except =&gt; :my_action.
&lt;br&gt;This will not be required anymore with Rails 3!
&lt;br&gt;
&lt;br&gt;The &lt;a href="http://github.com/rails/rails/commit/fdb61f02c54bda0ad5ff6d0259209113202b9307" target="_blank"&gt;touch method&lt;/a&gt; has also been added to ActiveRecord models.
&lt;br&gt;When called, it will save the record with the updated_at attribute set to the current time.
&lt;br&gt;
&lt;br&gt;It can also be used as an option &lt;a href="http://github.com/rails/rails/commit/abb899c54e8777428b7a607774370ba29a5573bd" target="_blank"&gt;with the belongs_to association&lt;/a&gt;. So when the current instance is saved/destroyed, the associated object will be touched too.
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:company&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:touch&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;If you follow the evolution of the Rails codebase you've probably been surprised by setup, depends_on and use keywords. You can see an example in &lt;a href="http://github.com/rails/rails/commit/c1aa5b0e14cd4bd27a5d8bd85cf7c36fa5911830" target="_blank"&gt;this commit&lt;/a&gt;.
&lt;br&gt;
&lt;br&gt;The source code for can be found in ActiveSupport (activesupport/ lib/active_support/core_ext/module/setup.rb) : 
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Module&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:_setup_block&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;attr_accessor&lt;/span&gt; &lt;span class="symbol"&gt;:_dependencies&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;setup&lt;/span&gt;&lt;span class="punct"&gt;(&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;blk&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@_setup_block&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;blk&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;use&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;
&lt;br&gt;    
&lt;br&gt;    &lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_dependencies&lt;/span&gt; &lt;span class="punct"&gt;||&lt;/span&gt; &lt;span class="punct"&gt;[]).&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;dep&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;use&lt;/span&gt; &lt;span class="ident"&gt;dep&lt;/span&gt;
&lt;br&gt;    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;    &lt;span class="comment"&gt;# raise &amp;quot;Circular dependencies&amp;quot; if self &amp;lt; mod&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;include&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;extend&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;const_get&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;ClassMethods&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;const_defined?&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;ClassMethods&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;class_eval&lt;/span&gt;&lt;span class="punct"&gt;(&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_setup_block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;_setup_block&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;depends_on&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;mod&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="keyword"&gt;return&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;self&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@_dependencies&lt;/span&gt; &lt;span class="punct"&gt;||=&lt;/span&gt; &lt;span class="punct"&gt;[]&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@_dependencies&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="ident"&gt;mod&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;A cleaner way to organize modules inclusion and dependencies. &lt;a href="http://yehudakatz.com/2009/04/07/better-module-organization/" target="_blank"&gt;Yehuda Katz wrote an article about that&lt;/a&gt;.</description>
      <author>Anthony Heukmes</author>
      <pubDate>Fri, 17 Apr 2009 16:17:40 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/9-edge-rails-rack-router-modules</link>
      <guid>http://www.2dconcept.com/articles/9-edge-rails-rack-router-modules</guid>
    </item>
    <item>
      <title>Add jQuery datagrids to your Ruby on Rails applications</title>
      <description>It's now possible to add jQuery datagrids to your Ruby on Rails applications with just a few lines of code.
&lt;br&gt;
&lt;br&gt;Have a look at the demo application of my new plugin : &lt;a href="http://www.2dconcept.com/jquery-grid-rails-plugin" target="_blank"&gt;2dcJqgrid&lt;/a&gt;.
&lt;br&gt;
&lt;br&gt;Datagrids are based on a jQuery plugin and support the following features :
&lt;br&gt;
&lt;br&gt;- Ajax-enabled
&lt;br&gt;- Pagination
&lt;br&gt;- Sorting
&lt;br&gt;- Filters
&lt;br&gt;- Multiple selections
&lt;br&gt;- Master-Details
&lt;br&gt;- Data manipulation (create, edit, delete)
&lt;br&gt;- And more ...</description>
      <author>Anthony Heukmes</author>
      <pubDate>Mon, 13 Apr 2009 14:57:42 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/8-jquery-grid-rails-plugin</link>
      <guid>http://www.2dconcept.com/articles/8-jquery-grid-rails-plugin</guid>
    </item>
    <item>
      <title>Ruby : Establish a connection to an FTP server via a proxy</title>
      <description>By default, it's not possible to connect to an FTP server via a proxy using the Net::FTP Ruby library.
&lt;br&gt;To use your proxy, you have to send RAW commands to the server :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="attribute"&gt;@ftp&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Net&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;FTP&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;br&gt;&lt;span class="attribute"&gt;@ftp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;connect&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;proxy_address&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;br&gt;&lt;span class="attribute"&gt;@ftp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sendcmd&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;USER ftp_login@ftp_address proxy_login&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;br&gt;&lt;span class="attribute"&gt;@ftp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sendcmd&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;PASS ftp_password&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;br&gt;&lt;span class="attribute"&gt;@ftp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sendcmd&lt;/span&gt;&lt;span class="punct"&gt;(&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;ACCT proxy_password&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;)&lt;/span&gt;
&lt;br&gt;&lt;span class="attribute"&gt;@ftp&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;passive&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;true&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;Take the time to replace addresses and credentials by yours.
&lt;br&gt;This code considers that access to your proxy server is secured by login/password.
&lt;br&gt;</description>
      <author>Anthony Heukmes</author>
      <pubDate>Wed, 08 Apr 2009 12:19:09 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/7-ruby-ftp-proxy-server</link>
      <guid>http://www.2dconcept.com/articles/7-ruby-ftp-proxy-server</guid>
    </item>
    <item>
      <title>Upload files in a BLOB field of an Oracle database</title>
      <description>Customers used to the Java &amp; Oracle worlds are often scared by the Ruby on Rails switch. They want to be sure that this new tool will do at least as much as the old one. This is a perfectly understandable reaction.
&lt;br&gt;To do so, they regularly ask for a POC (Proof of Concept) development to confirm that a given functionality can be easily implemented using Ruby on Rails.
&lt;br&gt;
&lt;br&gt;During one on my last meetings, the following reflexion came to my ears : "Are you sure that it will be possible to upload files in our Oracle database? I tried myself another scripting language (PHP) and I encountered many issues with BLOB!".
&lt;br&gt;
&lt;br&gt;So here is my POC responding to this question.
&lt;br&gt;I specified Oracle in the title of this article but the following Ruby code has nothing specific to this database.
&lt;br&gt;
&lt;br&gt;First of all, we need a table and a model to store data related to our file. You'll aslo need a controller and views.
&lt;br&gt;You can use the scaffold script provided by Rails to generate this structure :
&lt;br&gt;
&lt;br&gt;&lt;div class="code"&gt;
&lt;br&gt;$ ./script/generate scaffold FileUpload name:string content_type:string content_size:integer content:binary
&lt;br&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;Here is my migration file :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;CreateFileUploads&lt;/span&gt; &lt;span class="punct"&gt;&lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Migration&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.up&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;create_table&lt;/span&gt; &lt;span class="symbol"&gt;:file_uploads&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="symbol"&gt;:name&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;string&lt;/span&gt; &lt;span class="symbol"&gt;:content_type&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;integer&lt;/span&gt; &lt;span class="symbol"&gt;:content_size&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;binary&lt;/span&gt; &lt;span class="symbol"&gt;:content&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;t&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;timestamps&lt;/span&gt;
&lt;br&gt;    &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;self.down&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;drop_table&lt;/span&gt; &lt;span class="symbol"&gt;:file_uploads&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;Note the type of the content column : binary. This will generate a BLOB field in your database during the migration : 
&lt;br&gt;
&lt;br&gt;&lt;div class="code"&gt;
&lt;br&gt;$ rake db:migrate
&lt;br&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;Nothing special about the model :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;FileUpload&lt;/span&gt; &lt;span class="punct"&gt;&lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;You can then modify the creation form (new.html.erb) :
&lt;br&gt;
&lt;br&gt;&lt;div class="code"&gt;
&lt;br&gt;&lt;br/&gt;&amp;lt;% form_for @file_upload, :html =&amp;gt; { :multipart =&amp;gt; true } do |f| %&amp;gt;
&lt;br&gt;&lt;br/&gt;  &amp;lt;%= f.error_messages %&amp;gt;
&lt;br&gt;&lt;br/&gt;  &amp;lt;p&amp;gt;
&lt;br&gt;&lt;br/&gt;    &amp;lt;%= f.label :content %&amp;gt;&amp;lt;br /&amp;gt;
&lt;br&gt;&lt;br/&gt;    &amp;lt;%= f.file_field :content %&amp;gt;
&lt;br&gt;  &amp;lt;/p&amp;gt;
&lt;br&gt;&lt;br/&gt;  &amp;lt;p&amp;gt;
&lt;br&gt;&lt;br/&gt;    &amp;lt;%= f.submit 'Create' %&amp;gt;
&lt;br&gt;&lt;br/&gt;  &amp;lt;/p&amp;gt;
&lt;br&gt;&lt;br/&gt;&amp;lt;% end %&amp;gt;
&lt;br&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;The form has been defined has a multipart and the content field is now a file_field.
&lt;br&gt;You can then work on the create method of your controller :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;create&lt;/span&gt;
&lt;br&gt;  &lt;span class="attribute"&gt;@file_upload&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;FileUpload&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&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;:file_upload&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@file_upload&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;valid?&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@file_upload&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;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:file_upload&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="symbol"&gt;:content&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;original_filename&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@file_upload&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content&lt;/span&gt; &lt;span class="punct"&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;:file_upload&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="symbol"&gt;:content&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;read&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@file_upload&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content_type&lt;/span&gt; &lt;span class="punct"&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;:file_upload&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="symbol"&gt;:content&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;content_type&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@file_upload&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content_size&lt;/span&gt; &lt;span class="punct"&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;:file_upload&lt;/span&gt;&lt;span class="punct"&gt;][&lt;/span&gt;&lt;span class="symbol"&gt;:content&lt;/span&gt;&lt;span class="punct"&gt;].&lt;/span&gt;&lt;span class="ident"&gt;size&lt;/span&gt;
&lt;br&gt;    &lt;span class="attribute"&gt;@file_upload&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;flash&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:notice&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="string"&gt;FileUpload was successfully created.&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;redirect_to&lt;/span&gt; &lt;span class="attribute"&gt;@file_upload&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;else&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;render&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;Nothing complicated here, the params[:file_upload][:content] holds an instance of ActionController::UploadedStringIO on which you can perform various operations as reading data, get content type and size, ... All this information is then stored in the database.
&lt;br&gt;
&lt;br&gt;In the show.html.erb page, replace the content by a download link :
&lt;br&gt;
&lt;br&gt;&lt;div class="code"&gt;
&lt;br&gt;&lt;br/&gt;&amp;lt;p&amp;gt;
&lt;br&gt;&lt;br/&gt;  &amp;lt;b&amp;gt;Content:&amp;lt;/b&amp;gt;
&lt;br&gt;&lt;br/&gt;  &amp;lt;%= link_to "Download", :action =&amp;gt; "download", :id =&amp;gt; @file_upload.id &lt;br/&gt;%&amp;gt;
&lt;br&gt;&amp;lt;/p&amp;gt;
&lt;br&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;Finally, insert the download method in your controller and you're done!
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;download&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;file&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;FileUpload&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="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:id&lt;/span&gt;&lt;span class="punct"&gt;])&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;file&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;send_data&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:type&lt;/span&gt; &lt;span class="punct"&gt;=&gt;&lt;/span&gt; &lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;content_type&lt;/span&gt; &lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:filename&lt;/span&gt; &lt;span class="punct"&gt;=&gt;&lt;/span&gt; &lt;span class="ident"&gt;file&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;br&gt;  &lt;span class="keyword"&gt;else&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;flash&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:error&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="string"&gt;Invalid file ID!&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;redirect_to&lt;/span&gt; &lt;span class="symbol"&gt;:action&lt;/span&gt; &lt;span class="punct"&gt;=&gt;&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;One more time, it's very simple! The FileUpload record is extracted from the database using his ID. The associated file is then returned thanks to send_data method.
&lt;br&gt;
&lt;br&gt;You can now save any kind of file in your Oracle database!</description>
      <author>Anthony Heukmes</author>
      <pubDate>Tue, 31 Mar 2009 10:50:28 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/6-rails-upload-file-oracle-blob</link>
      <guid>http://www.2dconcept.com/articles/6-rails-upload-file-oracle-blob</guid>
    </item>
    <item>
      <title>Ruby on Rails - Why is it necessary to include all helpers in all views? (helper :all)</title>
      <description>I have various methods providing default behaviors in the application_helper.rb file of my current project.
&lt;br&gt;These methods are commons to all my controllers but some of them may decide to override this default behavior if necessary.
&lt;br&gt;To do so, they can redefine the methods in their own helper.
&lt;br&gt;
&lt;br&gt;Let's say that I have the say_hi method in application_helper.rb :
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;say_hi&lt;/span&gt;
&lt;br&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Hi from ApplicationController&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;If I call it in the views related to my controllers 'Controller1' and 'Controller2', the text "Hi from ApplicationController" will be correctly displayed.
&lt;br&gt;Now, I want to change this greeting message in the pages of Controller1. I can redefine the method say_hi in controller1_helper.rb :
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;say_hi&lt;/span&gt;
&lt;br&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Hi from Controller1&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;Everything works fine.
&lt;br&gt;But now, if I apply the same solution in controller2_helper.rb :
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;say_hi&lt;/span&gt;
&lt;br&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Hi from Controller2&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;The message displayed in the pages of Controller2 will be correct. But on the other hand, pages of Controller1 will display "Hi from Controller2" instead of "Hi from Controller1".
&lt;br&gt;This is a strange behavior, I was not excepting a such result.
&lt;br&gt;
&lt;br&gt;This issue is caused by this sentence in your ApplicationController :
&lt;br&gt;&lt;pre&gt;&lt;span class="ident"&gt;helper&lt;/span&gt; &lt;span class="symbol"&gt;:all&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;The goal of this method is to include all custom helpers in all views.
&lt;br&gt;All methods of all helpers will then be included in the current view.
&lt;br&gt;Controller2 is the last one in the list (alphabetical order) so it is the last included and his 'say_hi' method will be used.
&lt;br&gt;
&lt;br&gt;You can open the file actionpack/lib/action_controller/helpers.rb to see how it works :
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;helper&lt;/span&gt;&lt;span class="punct"&gt;(*&lt;/span&gt;&lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ident"&gt;block&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;args&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;flatten&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;arg&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;case&lt;/span&gt; &lt;span class="ident"&gt;arg&lt;/span&gt; 
&lt;br&gt;    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="constant"&gt;Module&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;add_template_helper&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;arg&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="symbol"&gt;:all&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;helper&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;all_application_helpers&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="constant"&gt;String&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;Symbol&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;file_name&lt;/span&gt;  &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;arg&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;to_s&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;underscore&lt;/span&gt; &lt;span class="punct"&gt;+&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;_helper&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;class_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;file_name&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;camelize&lt;/span&gt;
&lt;br&gt;      
&lt;br&gt;      &lt;span class="keyword"&gt;begin&lt;/span&gt;
&lt;br&gt;        &lt;span class="ident"&gt;require_dependency&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;file_name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;      &lt;span class="keyword"&gt;rescue&lt;/span&gt; &lt;span class="constant"&gt;LoadError&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;load_error&lt;/span&gt;
&lt;br&gt;        &lt;span class="ident"&gt;requiree&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt; -- (.*?)(.rb)?$&lt;/span&gt;&lt;span class="punct"&gt;/.&lt;/span&gt;&lt;span class="ident"&gt;match&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;load_error&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;message&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;to_a&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="number"&gt;1&lt;/span&gt;&lt;span class="punct"&gt;]&lt;/span&gt;
&lt;br&gt;        &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="ident"&gt;requiree&lt;/span&gt; &lt;span class="punct"&gt;==&lt;/span&gt; &lt;span class="ident"&gt;file_name&lt;/span&gt;
&lt;br&gt;          &lt;span class="ident"&gt;msg&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Missing helper file helpers/#{file_name}.rb&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;          &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;LoadError&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;msg&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;copy_blame!&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;load_error&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;        &lt;span class="keyword"&gt;else&lt;/span&gt;
&lt;br&gt;          &lt;span class="keyword"&gt;raise&lt;/span&gt;
&lt;br&gt;        &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;      &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;      &lt;span class="ident"&gt;add_template_helper&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;class_name&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;constantize&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;else&lt;/span&gt;
&lt;br&gt;     &lt;span class="keyword"&gt;raise&lt;/span&gt; &lt;span class="constant"&gt;ArgumentError&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;helper expects String, Symbol, or Module argument (was: #{args.inspect})&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;all_application_helpers&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;extract&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="regex"&gt;^#{Regexp.quote(helpers_dir)}&lt;/span&gt;&lt;span class="punct"&gt;\/&lt;/span&gt;&lt;span class="char"&gt;?(&lt;/span&gt;&lt;span class="punct"&gt;.*)&lt;/span&gt;&lt;span class="ident"&gt;_helper&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rb&lt;/span&gt;&lt;span class="global"&gt;$/&lt;/span&gt;
&lt;br&gt;  &lt;span class="constant"&gt;Dir&lt;/span&gt;&lt;span class="punct"&gt;[&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;#{helpers_dir}/**/*_helper.rb&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;].&lt;/span&gt;&lt;span class="ident"&gt;map&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt; &lt;span class="punct"&gt;|&lt;/span&gt;&lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;|&lt;/span&gt; &lt;span class="ident"&gt;file&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sub&lt;/span&gt; &lt;span class="ident"&gt;extract&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;\1&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt; &lt;span class="punct"&gt;}&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;When the helper method is called with the :all parameter, it will re-invoke itself with the result of all_application_helpers as a parameter.
&lt;br&gt;This method will return an array containing the names of all helpers defined in the app/helpers folder (in my case, 'application', 'controller1' and 'controller2').
&lt;br&gt;The new call to the helper method will then browse each name and include the corresponding helper.
&lt;br&gt;
&lt;br&gt;So I removed the helper :all line in my ApplicationController and everything worked fine.
&lt;br&gt;
&lt;br&gt;But I'm wondering on the interest of this method.
&lt;br&gt;Why would the methods associated to Controller2 be available in Controller1?
&lt;br&gt;I have no problem against the existence of this method but it's for me a mistake to include it by default in a fresh new Rails application.</description>
      <author>Anthony Heukmes</author>
      <pubDate>Wed, 25 Mar 2009 21:59:54 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/5-rails-helper-all</link>
      <guid>http://www.2dconcept.com/articles/5-rails-helper-all</guid>
    </item>
    <item>
      <title>[The inside of Rails] Controllers and instance variables</title>
      <description>For one of my latest projects, I had to implement a "generic" controller allowing management of various types of ActiveRecord objects.
&lt;br&gt;An administrator should for example be able to validate comments &amp; links suggestions before they appear on the website.
&lt;br&gt;This validation should be done through a common interface (a common controller /activations) to avoid code duplication.
&lt;br&gt;
&lt;br&gt;Thanks to Ruby dynamic nature it was of course very easy to implement. 
&lt;br&gt;
&lt;br&gt;But the following tips helped me to achieve my goals :
&lt;br&gt;
&lt;br&gt;The following code allows you to work with a class when his name is only known at runtime :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="ident"&gt;klass_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Article&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;klass&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Kernel&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;const_get&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;klass_name&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;klass&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;=&gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;created_at DESC&lt;/span&gt;&lt;span class="punct"&gt;')&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;It's sometimes also very useful to create/get instance variables dynamically :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="ident"&gt;var_name&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;article&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;instance_variable_set&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;@&lt;span class="expr"&gt;#{var_name}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;",&lt;/span&gt; &lt;span class="ident"&gt;klass&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="ident"&gt;params&lt;/span&gt;&lt;span class="punct"&gt;[&lt;/span&gt;&lt;span class="symbol"&gt;:id&lt;/span&gt;&lt;span class="punct"&gt;]))&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;instance_variable_get&lt;/span&gt;&lt;span class="punct"&gt;("&lt;/span&gt;&lt;span class="string"&gt;@&lt;span class="expr"&gt;#{var_name}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;")&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;Talking about instance variables... Do you know how it is possible to access instance variables you defined in your controllers into your views?
&lt;br&gt;In most frameworks, you have to specify explicitly which data you want to make available for your views.
&lt;br&gt;For example, using Java and Spring, you have to create a Map object with all your data and then use this map as a parameter for the render method.
&lt;br&gt;With Ruby on Rails it's done automatically and it's a good news! But how does it work?
&lt;br&gt;
&lt;br&gt;It's very simple.
&lt;br&gt;The following method is defined in the ActionView::Base class (actionpack/lib/action_view/base.rb) :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;&lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;copy_ivars_from_controller&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@controller&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;variables&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="attribute"&gt;@controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;instance_variable_names&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;variables&lt;/span&gt; &lt;span class="punct"&gt;-=&lt;/span&gt; &lt;span class="attribute"&gt;@controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;protected_instance_variables&lt;/span&gt; &lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="attribute"&gt;@controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;respond_to?&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:protected_instance_variables&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
&lt;br&gt;    &lt;span class="ident"&gt;variables&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;each&lt;/span&gt; &lt;span class="punct"&gt;{&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;instance_variable_set&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="attribute"&gt;@controller&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;instance_variable_get&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="punct"&gt;}&lt;/span&gt;
&lt;br&gt;  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;... and this method will be called from the render method of your view.
&lt;br&gt;What it does is simply get all the instance variables of the current controller (subtracting protected vars) and then recreate each of them in the current view using instance_variable_set.</description>
      <author>Anthony Heukmes</author>
      <pubDate>Tue, 03 Mar 2009 22:48:20 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/4-rails-dynamic-instance-variables</link>
      <guid>http://www.2dconcept.com/articles/4-rails-dynamic-instance-variables</guid>
    </item>
    <item>
      <title>ActiveRecord : Building a Rails application based a legacy database</title>
      <description>In a perfect world, a new data schema is created with a new Rails application. The database evolves with the application and will respect all the ActiveRecord conventions.
&lt;br&gt;It is the ideal case because no configuration is required and you can fully benefit of migrations.
&lt;br&gt;The development speed reaches his maximum.
&lt;br&gt;
&lt;br&gt;But legacy databases are everywhere in professional environments.
&lt;br&gt;A big Oracle schema which doesn't respect any ActiveRecord convention and that you cannot modify because other applications are already based on it.
&lt;br&gt;The only thing you can do is create views in your schema and it is often very useful. But it's not enough.
&lt;br&gt;
&lt;br&gt;Does that mean you have to forget about Rails and come back to Java development? Fortunately, the answer is no! :-)
&lt;br&gt;
&lt;br&gt;As you already know, a schema is "compatible" with ActiveRecord if he follows a few conventions. So the name of the table must be the pluralized name of the model (User -&gt; Users)
&lt;br&gt;and your primary key must be an auto-incremented value called ID.
&lt;br&gt;The MUST verb is however not right here. If you follow the conventions, you will not have to configure your model, the mapping between your Ruby object and your table will be done automatically. But if the conventions are not respected, you'll always have the possibility to configure the mapping yourself.
&lt;br&gt;
&lt;br&gt;Let's take the following schema : 
&lt;br&gt;
&lt;br&gt;&lt;img src="/images/articles/legacy-1.png"/&gt;
&lt;br&gt;
&lt;br&gt;It clearly doesn't follow the ActiveRecord conventions. The name of the "my_users" table should be "users", and the primary key should be "id" instead of "my_pk."
&lt;br&gt;
&lt;br&gt;I'm working with an Oracle database that doesn't support auto incrementation like MySQL does. To achieve the same goal, I had to create a sequence named "my_users_autoi".
&lt;br&gt;
&lt;br&gt;My User.rb class looks like this :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;User&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;set_table_name&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;my_users&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;set_primary_key&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;my_pk&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;set_sequence_name&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;my_users_autoi&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;As you can see, there is no magic here. You can now manipulate your model, all CRUD operations are available. And if you try to create a new user, you'll notify that the db sequence is used to assign the primary key.
&lt;br&gt;
&lt;br&gt;A user can write articles. So there is a one-to-many association between the two entities. The article class respects the two previous conventions but the name of the foreign key is not correct. It should be user_id. We have to configure our model and add the relationship in the User class : 
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Article&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foreign_key&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;by_user&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;User&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;  &lt;span class="punct"&gt;...&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:articles&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foreign_key&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;by_user&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;You can then start manipulating your data :
&lt;br&gt;
&lt;br&gt;((
&lt;br&gt;usr = User.create(:pseudo =&gt; 'antho', :email =&gt; 'ahe@me.com')
&lt;br&gt;Article.create(:title =&gt; 'My first article', :user =&gt; usr, :creation_date =&gt; Date.today)
&lt;br&gt;usr.articles.first.title # =&gt; 'My first article'
&lt;br&gt;))
&lt;br&gt;
&lt;br&gt;And voilaaa!
&lt;br&gt;
&lt;br&gt;The Ranking table is however a little more problematic. Users can rate articles, giving them a note between 1 &amp; 5.
&lt;br&gt;The primary key of this table is composite : it is based on BY_USER and FOR_ARTICLE.
&lt;br&gt;ActiveRecord doesn't support composite primary keys but fortunately &lt;a target="_blank" href="http://compositekeys.rubyforge.org"&gt;there is a library supporting this feature&lt;/a&gt;. 
&lt;br&gt;Install it following the instructions on the website of his author.
&lt;br&gt;
&lt;br&gt;When it's done, create the Ranking class and update your previous classes to reflect this new association :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Ranking&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;set_table_name&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;ranking&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;set_primary_keys&lt;/span&gt; &lt;span class="symbol"&gt;:by_user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:for_article&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:user&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:article&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;User&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;set_table_name&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;my_users&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;set_primary_key&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;my_pk&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;set_sequence_name&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;my_users_autoi&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:articles&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foreign_key&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;by_user&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:rankings&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foreign_key&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;by_user&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;
&lt;br&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Article&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;set_sequence_name&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;articles_autoi&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;  &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foreign_key&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;by_user&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;has_many&lt;/span&gt; &lt;span class="symbol"&gt;:rankings&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:foreign_key&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;for_article&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  
&lt;br&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;Users can now rate your articles :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="ident"&gt;rk&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Ranking&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;new&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;rk&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;rank&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="number"&gt;5&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;rk&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;by_user&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;usr&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;my_pk&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;rk&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;for_article&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="ident"&gt;usr&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;articles&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;id&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;rk&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;save&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;Don't miss the fact that you have to specify explicitly the primary key (user.my_pk &amp; article.id).
&lt;br&gt;
&lt;br&gt;And that's it! I think you can now affirm that a Rails application can be easily created on a legacy database!</description>
      <author>Anthony Heukmes</author>
      <pubDate>Fri, 20 Feb 2009 15:51:51 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/2-rails-legacy-db-activerecord-conventions</link>
      <guid>http://www.2dconcept.com/articles/2-rails-legacy-db-activerecord-conventions</guid>
    </item>
    <item>
      <title>Ruby on Rails plugin : manage the titles of your pages very easily!</title>
      <description>EasyTitles is a Ruby on Rails plugin that allows you to easily manage the titles of your pages.
&lt;br&gt;Instead of creating @title variables inside your controllers &amp; views, EasyTitles gives you the possiblity to centralize your titles in YAML files.
&lt;br&gt;This plugin also supports internationalization (I18n) if you use a version of Rails &gt;= 2.2.
&lt;br&gt;
&lt;br&gt;The big advantage is that all titles are centralized in one place, making them easy to manage.
&lt;br&gt;
&lt;br&gt;Let's say that you have a REST "Articles" controller (with basic CRUD methods), the only one thing you have to do is to create a YAML file respecting the following format :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="ident"&gt;articles&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Listing articles&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Article details&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;New article'&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;edit&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;Edit article&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;You can then add a call to the easy_title helper method in the title tag of your layout :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="punct"&gt;&amp;lt;&lt;/span&gt;&lt;span class="ident"&gt;title&lt;/span&gt;&lt;span class="punct"&gt;&amp;gt;&amp;lt;%=&lt;/span&gt;&lt;span class="string"&gt; easy_title %&amp;gt;&amp;lt;/title&amp;gt;
&lt;span class="normal"&gt;&lt;br&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;This method will determine the title to display in function of the current controller name &amp; action name.
&lt;br&gt;So if you are on the /articles/show page, the title "Article details" will be displayed.
&lt;br&gt;
&lt;br&gt;EasyTitles also allows you to set default titles :
&lt;br&gt;
&lt;br&gt;&lt;pre&gt;
&lt;br&gt;&lt;span class="ident"&gt;default&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;This title will be displayed for any controller/action without a defined title&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;&lt;span class="ident"&gt;articles&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;default&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;This title will be displayed for articles methods without a defined title&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;index&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Listing articles&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;show&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Article details&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;new&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;New article&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;  &lt;span class="ident"&gt;edit&lt;/span&gt;&lt;span class="punct"&gt;:&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;Edit article&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;br&gt;&lt;/pre&gt;
&lt;br&gt;
&lt;br&gt;&lt;h2&gt;Installation&lt;/h2&gt;
&lt;br&gt;&lt;hr class="sep"/&gt;
&lt;br&gt;&lt;ol&gt;
&lt;br&gt;&lt;li&gt;script/plugin install git://github.com/ahe/easytitles.git&lt;/li&gt;
&lt;br&gt;&lt;li&gt;Create a titles folder in your config folder (RAILS_ROOT/config/titles).&lt;/li&gt;
&lt;br&gt;&lt;li&gt;If you are not using I18n (internationalization) create a all.yml file in your titles folder.&lt;/li&gt;
&lt;br&gt;&lt;li&gt;Otherwise, create a yml file for each locale (en.yml, fr.yml, …) in your titles folder.&lt;/li&gt;
&lt;br&gt;&lt;li&gt;Put all your titles in the yml file(s) while respecting the above format.&lt;/li&gt;
&lt;br&gt;&lt;li&gt;Add the easy_title call in your title tag : &amp;lt;title&gt;&amp;lt;%= easy_title %&gt;&amp;lt;/title&gt;&lt;/li&gt;
&lt;br&gt;&lt;/ol&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;
&lt;br&gt;</description>
      <author>Anthony Heukmes</author>
      <pubDate>Tue, 17 Feb 2009 21:14:38 +0000</pubDate>
      <link>http://www.2dconcept.com/articles/1-rails-plugin-manage-titles</link>
      <guid>http://www.2dconcept.com/articles/1-rails-plugin-manage-titles</guid>
    </item>
  </channel>
</rss>
