<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>fabiolagana.net &#187; Ruby on Rails</title>
	<atom:link href="http://blog.fabiolagana.net/tag/ruby-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fabiolagana.net</link>
	<description>640 Kb should be enough memory for anybody</description>
	<lastBuildDate>Mon, 26 Oct 2009 13:17:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>HOWTO: installing, updating and removing rubygems</title>
		<link>http://blog.fabiolagana.net/howto-installing-updating-removing-rubygems/</link>
		<comments>http://blog.fabiolagana.net/howto-installing-updating-removing-rubygems/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 01:00:47 +0000</pubDate>
		<dc:creator>Fabio Laganà</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[RubyGems]]></category>
		<category><![CDATA[Howto]]></category>

		<guid isPermaLink="false">http://blog.fabiolagana.net/?p=8</guid>
		<description><![CDATA[&#160;Powered by Max Banner Ads&#160;Searching Installing a gem in fair enough but what if you don&#8217;t know what it&#8217;s called? Well, one way of finding a gem is to look at the rubygems homepage at http://rubyforge.org/projects/rubygems/ However, this can be a bit overwhelming and may be a long way around if you know what you [...]]]></description>
			<content:encoded><![CDATA[<h2>Searching</h2>
<p>Installing a gem in fair enough but what if you don&#8217;t know what it&#8217;s called?</p>
<p>Well, one way of finding a gem is to look at the rubygems homepage at <a class="external free" title="http://rubyforge.org/projects/rubygems/" rel="nofollow" href="http://rubyforge.org/projects/rubygems/" onclick="pageTracker._trackPageview('/outgoing/rubyforge.org/projects/rubygems/?referer=');">http://rubyforge.org/projects/rubygems/</a></p>
<p><span id="more-8"></span>However, this can be a bit overwhelming and may be a long way around if you know what you are looking for. In cases like these you can search a remote list of gems for the phrase you are after:</p>
<pre>gem search mysql --remote gems.rubyforge.org</pre>
<p>This will give a list of gems with the word &#8216;mysql&#8217; in them.</p>
<p><a name="Installing"></a></p>
<h2>Installing</h2>
<p>Installing a particular gem is very simple:</p>
<pre>sudo gem install mysql</pre>
<p>That will, not unsurprisingly, install the gem &#8216;mysql&#8217; (which is the ruby bindings for MySQL, not MySQL itself!).</p>
<p>The example above will give a choice of versions to install. On a Linux VPS simply choose the latest &#8216;ruby&#8217; version. So at the time of writing I would select option (3) mysql 2.7 (ruby).</p>
<p>Often a gem will have several dependencies with it. To stop the install asking if you want the dependencies to be installed use this:</p>
<pre>sudo gem install mysql --include-dependencies</pre>
<p><a name="Outdated"></a></p>
<h2>Outdated</h2>
<p>To get a list of gems that are now outdated (they have a newer version available), use this command:</p>
<pre>gem outdated</pre>
<p><a name="Updating"></a></p>
<h2>Updating</h2>
<p>To update all the installed rubygems is just as straightforward:</p>
<pre>gem update</pre>
<p>However, you may not want to update all at once, in which case specify the gem:</p>
<pre>gem update mysql</pre>
<p><a name="Clean"></a></p>
<h2>Clean</h2>
<p>This will remove outdated versions of gems that are installed, leaving the new updated version installed:</p>
<pre>gem clean</pre>
<p>This will leave a nice and shiny up to date rubygems install.</p>
<h2>Removing</h2>
<p>At some point you may want to get rid of a gem completely. No problem:</p>
<pre>sudo gem uninstall mysql</pre>
<p><a name="Listing_installed_gems"></a></p>
<h2>Listing installed gems</h2>
<p>To get a list of locally installed gems, issue this command:</p>
<pre>gem list</pre>
<p>That will give an overview of the gems you have installed.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabiolagana.net/howto-installing-updating-removing-rubygems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>InVisible Ruby On Rails Reference 1.1.2</title>
		<link>http://blog.fabiolagana.net/invisible-ruby-on-rails-reference-112/</link>
		<comments>http://blog.fabiolagana.net/invisible-ruby-on-rails-reference-112/#comments</comments>
		<pubDate>Thu, 20 Mar 2008 09:23:43 +0000</pubDate>
		<dc:creator>Fabio Laganà</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.fabiolagana.net/?p=3</guid>
		<description><![CDATA[This is a &#8220;short&#8221; Ruby on Rails reference. It&#8217;s goal is to give you an overview over the most used functions / methods / classes. It&#8217;s not a tutorial, but as a handy guide when you already know your way around. This reference guide is Â© 2006 by InVisible GmbH (http://www.invisible.ch) and released under a [...]]]></description>
			<content:encoded><![CDATA[<p>This is a &#8220;short&#8221; Ruby on Rails reference. It&#8217;s goal is to give you an overview over the most used functions / methods / classes. It&#8217;s not a tutorial, but as a handy guide when you already know your way around.</p>
<p>This reference guide is Â© 2006 by InVisible GmbH (<a href="http://www.invisible.ch/" onclick="pageTracker._trackPageview('/outgoing/www.invisible.ch/?referer=');">http://www.invisible.ch</a>) and released under a Creative Commons license (see end for details). More information and a PDF version of this document can be found at <a href="http://blog.invisible.ch/2006/05/01/ruby-on-rails-reference/" onclick="pageTracker._trackPageview('/outgoing/blog.invisible.ch/2006/05/01/ruby-on-rails-reference/?referer=');">http://blog.invisible.ch/2006/05/01/ruby-on-rails-reference/</a>.<span id="more-3"></span></p>
<h1 id="railties">Railties</h1>
<h2 id="createarailsapplication">Create a rails application</h2>
<pre><code>
</code></pre>
<pre><span class="global">$ </span><span class="ident">rails</span> <span class="ident">app_name</span></pre>
<p>Options:</p>
<ul>
<li><strong>-d, â€”database=xxx</strong> specify which database to use (mysql oracle postgresql sqlite2 sqlite3 ), defaults to <em>mysql</em></li>
<li><strong>-r, â€”ruby-path=</strong> specify the path to ruby, if not set, the scripts use <em>env</em> to find ruby</li>
<li><strong>-f, â€”freeze</strong> freezes Rails into the <code>vendor/rails</code> directory</li>
</ul>
<h2 id="apidocumentation">API Documentation</h2>
<pre><code>
</code></pre>
<pre><span class="global">$ </span><span class="ident">gem_server</span></pre>
<p>Open a web browser with the address <code>localhost:8808</code></p>
<h2 id="rake">Rake</h2>
<p>is the make of ruby &#8211; the <strong>R</strong> uby m <strong>AKE</strong>. Rails defines a number of tasks to help you:</p>
<pre><code>
</code></pre>
<pre><span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:fixtures:load</span>          <span class="comment"># Load fixtures into the current environment's database. </span>
<span class="comment"># Load specific fixtures using FIXTURES=x,y</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:migrate</span>                <span class="comment"># Migrate the database through scripts in db/migrate. Target </span>
<span class="comment"># specific version with VERSION=x</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:schema:dump</span>            <span class="comment"># Create a db/schema.rb file that can be portably used against </span>
<span class="comment"># any DB supported by AR</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:schema:load</span>            <span class="comment"># Load a schema.rb file into the database</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:sessions:clear</span>         <span class="comment"># Clear the sessions table</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:sessions:create</span>        <span class="comment"># Creates a sessions table for use with </span>
<span class="comment"># CGI::Session::ActiveRecordStore</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:structure:dump</span>         <span class="comment"># Dump the database structure to a SQL file</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:test:clone</span>             <span class="comment"># Recreate the test database from the current environment's </span>
<span class="comment"># database schema</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:test:clone_structure</span>   <span class="comment"># Recreate the test databases from the development structure</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:test:prepare</span>           <span class="comment"># Prepare the test database and load the schema</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:test:purge</span>             <span class="comment"># Empty the test database</span>

<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:app</span>                   <span class="comment"># Build the app HTML Files</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:clobber_app</span>           <span class="comment"># Remove rdoc products</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:clobber_plugins</span>       <span class="comment"># Remove plugin documentation</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:clobber_rails</span>         <span class="comment"># Remove rdoc products</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:plugins</span>               <span class="comment"># Generate documation for all installed plugins</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:rails</span>                 <span class="comment"># Build the rails HTML Files</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:reapp</span>                 <span class="comment"># Force a rebuild of the RDOC files</span>
<span class="ident">rake</span> <span class="ident">doc</span><span class="symbol">:rerails</span>               <span class="comment"># Force a rebuild of the RDOC files</span>

<span class="ident">rake</span> <span class="ident">log</span><span class="symbol">:clear</span>                 <span class="comment"># Truncates all *.log files in log/ to zero bytes</span>

<span class="ident">rake</span> <span class="ident">rails</span><span class="symbol">:freeze:edge</span>         <span class="comment"># Lock this application to latest Edge Rails. Lock a specific </span>
<span class="comment"># revision with REVISION=X</span>
<span class="ident">rake</span> <span class="ident">rails</span><span class="symbol">:freeze:gems</span>         <span class="comment"># Lock this application to the current gems (by unpacking them </span>
<span class="comment"># into vendor/rails)</span>
<span class="ident">rake</span> <span class="ident">rails</span><span class="symbol">:unfreeze</span>            <span class="comment"># Unlock this application from freeze of gems or edge and return </span>
<span class="comment"># to a fluid use of system gems</span>
<span class="ident">rake</span> <span class="ident">rails</span><span class="symbol">:update</span>              <span class="comment"># Update both scripts and public/javascripts from Rails</span>
<span class="ident">rake</span> <span class="ident">rails</span><span class="symbol">:update:javascripts</span>  <span class="comment"># Update your javascripts from your current rails install</span>
<span class="ident">rake</span> <span class="ident">rails</span><span class="symbol">:update:scripts</span>      <span class="comment"># Add new scripts to the application script/ directory</span>

<span class="ident">rake</span> <span class="ident">stats</span>                     <span class="comment"># Report code statistics (KLOCs, etc) from the application</span>

<span class="ident">rake</span> <span class="ident">test</span>                      <span class="comment"># Test all units and functionals</span>
<span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:functionals</span>          <span class="comment"># Run tests for functionalsdb:test:prepare</span>
<span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:integration</span>          <span class="comment"># Run tests for integrationdb:test:prepare</span>
<span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:plugins</span>              <span class="comment"># Run tests for pluginsenvironment</span>
<span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:recent</span>               <span class="comment"># Run tests for recentdb:test:prepare</span>
<span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:uncommitted</span>          <span class="comment"># Run tests for uncommitteddb:test:prepare</span>
<span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:units</span>                <span class="comment"># Run tests for unitsdb:test:prepare</span>

<span class="ident">rake</span> <span class="ident">tmp</span><span class="symbol">:cache:clear</span>           <span class="comment"># Clears all files and directories in tmp/cache</span>
<span class="ident">rake</span> <span class="ident">tmp</span><span class="symbol">:clear</span>                 <span class="comment"># Clear session, cache, and socket files from tmp/</span>
<span class="ident">rake</span> <span class="ident">tmp</span><span class="symbol">:create</span>                <span class="comment"># Creates tmp directories for sessions, cache, and sockets</span>
<span class="ident">rake</span> <span class="ident">tmp</span><span class="symbol">:sessions:clear</span>        <span class="comment"># Clears all files in tmp/sessions</span>
<span class="ident">rake</span> <span class="ident">tmp</span><span class="symbol">:sockets:clear</span>         <span class="comment"># Clears all ruby_sess.* files in tmp/sessions</span></pre>
<h2 id="scripts">Scripts</h2>
<pre><code>
</code></pre>
<pre><span class="ident">script</span><span class="punct">/</span><span class="ident">about</span>            <span class="comment"># Information about environenment</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">breakpointer</span>     <span class="comment"># starts the breakpoint server</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">console</span>          <span class="comment"># interactive Rails Console</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">destroy</span>          <span class="comment"># deletes files created by generators</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span>         <span class="comment"># -&gt; generators</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span>           <span class="comment"># -&gt; Plugins</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">runner</span>           <span class="comment"># executes a task in the rails context</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">server</span>           <span class="comment"># launches the development server</span>
<span class="comment"># http://localhost:3000</span>

<span class="ident">script</span><span class="punct">/</span><span class="ident">performance</span><span class="punct">/</span><span class="ident">profiler</span>     <span class="comment"># profile an expenive method</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">performance</span><span class="punct">/</span><span class="ident">benchmarker</span>  <span class="comment"># benchmark different methods</span>

<span class="ident">script</span><span class="punct">/</span><span class="ident">process</span><span class="punct">/</span><span class="ident">reaper</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">process</span><span class="punct">/</span><span class="ident">spawner</span></pre>
<h2 id="generators">Generators</h2>
<pre><code>
</code></pre>
<pre><span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">model</span> <span class="constant">ModelName</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">controller</span> <span class="constant">ListController</span> <span class="ident">show</span> <span class="ident">edit</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">scaffold</span> <span class="constant">ModelName</span> <span class="constant">ControllerName</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">migration</span> <span class="constant">AddNewTable</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">plugin</span> <span class="constant">PluginName</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">mailer</span> <span class="constant">Notification</span> <span class="ident">lost_password</span> <span class="ident">signup</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">web_service</span> <span class="constant">ServiceName</span> <span class="ident">api_one</span> <span class="ident">api_two</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">integration_test</span> <span class="constant">TestName</span>
<span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">session_migration</span></pre>
<p>Options</p>
<pre><code>
</code></pre>
<pre><span class="punct">-</span><span class="ident">p</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">pretend</span>                    <span class="constant">Run</span> <span class="ident">but</span> <span class="keyword">do</span> <span class="keyword">not</span> <span class="ident">make</span> <span class="ident">any</span> <span class="ident">changes</span><span class="punct">.</span>
<span class="punct">-</span><span class="ident">f</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">force</span>                      <span class="constant">Overwrite</span> <span class="ident">files</span> <span class="ident">that</span> <span class="ident">already</span> <span class="ident">exist</span><span class="punct">.</span>
<span class="punct">-</span><span class="ident">s</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">skip</span>                       <span class="constant">Skip</span> <span class="ident">files</span> <span class="ident">that</span> <span class="ident">already</span> <span class="ident">exist</span><span class="punct">.</span>
<span class="punct">-</span><span class="ident">q</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">quiet</span>                      <span class="constant">Suppress</span> <span class="ident">normal</span> <span class="ident">output</span><span class="punct">.</span>
<span class="punct">-</span><span class="ident">t</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">backtrace</span>                  <span class="constant">Debugging</span><span class="punct">:</span> <span class="ident">show</span> <span class="ident">backtrace</span> <span class="ident">on</span> <span class="ident">errors</span><span class="punct">.</span>
<span class="punct">-</span><span class="ident">h</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">help</span>                       <span class="constant">Show</span> <span class="ident">this</span> <span class="ident">help</span> <span class="ident">message</span><span class="punct">.</span>
<span class="punct">-</span><span class="ident">c</span><span class="punct">,</span> <span class="punct">--</span><span class="ident">svn</span>                        <span class="constant">Modify</span> <span class="ident">files</span> <span class="ident">with</span> <span class="ident">subversion</span><span class="punct">.</span> <span class="punct">(</span><span class="ident">Note</span><span class="punct">:</span> <span class="ident">svn</span> <span class="ident">must</span> <span class="ident">be</span> <span class="keyword">in</span> <span class="ident">path</span><span class="punct">)</span></pre>
<h2 id="plugins">Plugins</h2>
<pre><code>
</code></pre>
<pre><span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">discover</span>          <span class="comment"># discover plugin repositories</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">list</span>              <span class="comment"># list all available plugins</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">install</span> <span class="ident">where</span>     <span class="comment"># install the â€žwhereâ€œ plugin</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">install</span> <span class="punct">-</span><span class="ident">x</span> <span class="ident">where</span>  <span class="comment"># install where plugin as SVN external</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">install</span> <span class="ident">http</span><span class="punct">:/</span><span class="regex"><span class="punct">/</span><span class="ident">invisible</span><span class="punct">.</span><span class="ident">ch</span><span class="punct">/</span><span class="ident">projects</span><span class="punct">/</span><span class="ident">plugins</span><span class="punct">/</span><span class="ident">where</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">update</span>            <span class="comment"># update installed plugins</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">source</span>            <span class="comment"># add a source repository</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">unsource</span>          <span class="comment"># removes a source repository</span>
<span class="ident">script</span><span class="punct">/</span><span class="ident">plugin</span> <span class="ident">sources</span>           <span class="comment"># lists source repositories</span></span></pre>
<p>A searchable directory of plugins can be found at <a href="http://www.agilewebdevelopment.com/" onclick="pageTracker._trackPageview('/outgoing/www.agilewebdevelopment.com/?referer=');">AgileDevelopment</a>.</p>
<h1 id="models">Models</h1>
<h2 id="objectcreation">Object creation</h2>
<pre><code>
</code></pre>
<pre><span class="constant">Model</span><span class="punct">.</span><span class="ident">new</span>   <span class="comment"># creates a new empty model</span>
<span class="constant">Model</span><span class="punct">.</span><span class="ident">create</span><span class="punct">(</span> <span class="symbol">:field</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">value</span><span class="punct">',</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ther_field</span> <span class="punct">=&gt;</span> <span class="number">42</span> <span class="punct">)</span>
<span class="comment"># creates an object with the passed parameters and saves it</span>

<span class="constant">Model</span><span class="punct">.</span><span class="ident">find_or_create_by_field</span><span class="punct">(</span> <span class="ident">value</span> <span class="punct">)</span>
<span class="comment"># searches for a record where "field = value", creates</span>
<span class="comment"># a new record if not found</span>

<span class="constant">User</span><span class="punct">.</span><span class="ident">find_or_create_by_name_and_email</span><span class="punct">(</span> <span class="punct">'</span><span class="string">joe</span><span class="punct">',</span> <span class="punct">'</span><span class="string">joe@example.com</span><span class="punct">')</span></pre>
<h2 id="modelrelations">Model Relations</h2>
<p>There are four ways of associating models. <strong>has_one</strong>, <strong>has_many</strong>, <strong>belongs_to</strong> and <strong>has_and_belongs_to_many</strong></p>
<p><img id="assocs" src="http://blog.invisible.ch/files/images/assocs.png" alt="Assocs" /></p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">Order</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_many</span> <span class="symbol">:line_items</span>
<span class="ident">belongs_to</span> <span class="symbol">:customer</span>   <span class="comment"># there's a column "customer_id" in the db table</span>
<span class="keyword">end</span>

<span class="keyword">def </span><span class="method">LineItem</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">belongs_to</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span> <span class="comment"># there's a column "order_id" in the db table</span>
<span class="keyword">end</span>

<span class="keyword">def </span><span class="method">Customer</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_many</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rders</span>
<span class="ident">has_one</span> <span class="symbol">:address</span>
<span class="keyword">end</span>

<span class="keyword">def </span><span class="method">Address</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">belongs_to</span> <span class="symbol">:customer</span>
<span class="keyword">end</span>

<span class="ident">belongs_to</span>  <span class="symbol">:some_model</span><span class="punct">,</span>
<span class="symbol">:class_name</span>  <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">MyClass</span><span class="punct">',</span>      <span class="comment"># specifies other class name</span>
<span class="symbol">:foreign_key</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">my_real_id</span><span class="punct">',</span>   <span class="comment"># and primary key </span>
<span class="symbol">:conditions</span>  <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">column = 0</span><span class="punct">'</span>    <span class="comment"># only finds when this condition met </span>

<span class="ident">has_one</span> <span class="symbol">:some_model</span><span class="punct">,</span>
<span class="comment"># as belongs_to and additionally:</span>
<span class="symbol">:dependent</span>   <span class="punct">=&gt;</span> <span class="symbol">:destroy</span>        <span class="comment"># deletes associated object</span>
<span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span>       <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">name ASC</span><span class="punct">'</span>      <span class="comment"># SQL fragment for sorting</span>

<span class="ident">has_many</span> <span class="symbol">:some_model</span>
<span class="comment"># as has_one and additionally:</span>
<span class="symbol">:dependent</span> <span class="punct">=&gt;</span> <span class="symbol">:destroy</span>          <span class="comment"># deletes all dependent data</span>
<span class="comment"># calling each objects destroy</span>
<span class="symbol">:dependent</span> <span class="punct">=&gt;</span> <span class="symbol">:delete_all</span>       <span class="comment"># deletes all dependent data</span>
<span class="comment"># without calling the destroy methods</span>
<span class="symbol">:dependent</span> <span class="punct">=&gt;</span> <span class="symbol">:nullify</span>          <span class="comment"># set association to null, not </span>
<span class="comment"># destroying objects</span>
<span class="symbol">:group</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">name</span><span class="punct">'</span>                <span class="comment"># adds GROUP BY fragment</span>
<span class="symbol">:finder_sql</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">select ....</span><span class="punct">'</span>    <span class="comment"># instead of the Rails finders</span>
<span class="symbol">:counter_sql</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">select ...</span><span class="punct">'</span>    <span class="comment"># instead of the Rails counters</span></pre>
<p><img id="habtm" src="http://blog.invisible.ch/files/images/habtm.png" alt="Habtm" /></p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">Category</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_and_belongs_to_many</span> <span class="symbol">:products</span>
<span class="keyword">end</span>
<span class="keyword">def </span><span class="method">Product</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_and_belongs_to_many</span> <span class="symbol">:categories</span>
<span class="keyword">end</span></pre>
<p>Table <code>categories_products</code> with <code>category_id</code> and <code>product_id</code> (without id column)</p>
<h3 id="associationjoinmodels">Association Join Models</h3>
<p><img id="throughmodel" src="http://blog.invisible.ch/files/images/through-model.png" alt="Through Model" /></p>
<pre><code>
</code></pre>
<pre><span class="keyword">class </span><span class="class">Author</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_many</span> <span class="symbol">:authorships</span>
<span class="ident">has_many</span> <span class="symbol">:books</span><span class="punct">,</span> <span class="symbol">:through</span> <span class="punct">=&gt;</span> <span class="symbol">:authorships</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">Authorship</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">belongs_to</span> <span class="symbol">:author</span>
<span class="ident">belongs_to</span> <span class="symbol">:book</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">Book</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_one</span> <span class="symbol">:authorship</span>
<span class="keyword">end</span>

<span class="attribute">@author</span> <span class="punct">=</span> <span class="constant">Author</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:first</span>
<span class="attribute">@author</span><span class="punct">.</span><span class="ident">authorships</span><span class="punct">.</span><span class="ident">collect</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">a</span><span class="punct">|</span> <span class="ident">a</span><span class="punct">.</span><span class="ident">book</span> <span class="punct">}</span> <span class="comment"># selects all books that the author's </span>
<span class="comment"># authorships belong to.</span>
<span class="attribute">@author</span><span class="punct">.</span><span class="ident">books</span>                              <span class="comment"># selects all books by using the Authorship</span>
<span class="comment"># join model</span></pre>
<p>Also works through has_many associations:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">class </span><span class="class">Firm</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">has_many</span>   <span class="symbol">:clients</span>
<span class="ident">has_many</span>   <span class="symbol">:invoices</span><span class="punct">,</span> <span class="symbol">:through</span> <span class="punct">=&gt;</span> <span class="symbol">:clients</span>
<span class="ident">has_many</span>   <span class="symbol">:paid_invoices</span><span class="punct">,</span> <span class="symbol">:through</span> <span class="punct">=&gt;</span> <span class="symbol">:clients</span><span class="punct">,</span> <span class="symbol">:source</span> <span class="punct">=&gt;</span> <span class="symbol">:invoice</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">Client</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">belongs_to</span> <span class="symbol">:firm</span>
<span class="ident">has_many</span>   <span class="symbol">:invoices</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">Invoice</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">belongs_to</span> <span class="symbol">:client</span>
<span class="keyword">end</span>

<span class="attribute">@firm</span> <span class="punct">=</span> <span class="constant">Firm</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:first</span>
<span class="attribute">@firm</span><span class="punct">.</span><span class="ident">clients</span><span class="punct">.</span><span class="ident">collect</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">c</span><span class="punct">|</span> <span class="ident">c</span><span class="punct">.</span><span class="ident">invoices</span> <span class="punct">}.</span><span class="ident">flatten</span> <span class="comment"># select all invoices for all clients</span>
<span class="comment"># of the firm</span>
<span class="attribute">@firm</span><span class="punct">.</span><span class="ident">invoices</span>                                   <span class="comment"># selects all invoices by going through</span>
<span class="comment"># the Client join model.</span></pre>
<h2 id="validations">Validations</h2>
<pre><code>
</code></pre>
<pre><span class="ident">validates_presence_of</span> <span class="symbol">:firstname</span><span class="punct">,</span> <span class="symbol">:lastname</span>     <span class="comment"># must be filled out</span>

<span class="ident">validates_length_of</span> <span class="symbol">:password</span><span class="punct">,</span>
<span class="symbol">:minimum</span> <span class="punct">=&gt;</span> <span class="number">8</span>           <span class="comment"># more than 8 characters</span>
<span class="symbol">:maximum</span> <span class="punct">=&gt;</span> <span class="number">16</span>          <span class="comment"># shorter than 16 characters</span>
<span class="symbol">:in</span> <span class="punct">=&gt;</span> <span class="number">8</span><span class="punct">..</span><span class="number">16</span>            <span class="comment"># between 8 and 16 characters</span>
<span class="symbol">:too_short</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">way too short</span><span class="punct">'</span>
<span class="symbol">:too_long</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">way to long</span><span class="punct">'</span>

<span class="ident">validates_acceptance_of</span> <span class="symbol">:eula</span>               <span class="comment"># Must accept a condition</span>
<span class="symbol">:accept</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Y</span><span class="punct">'</span>      <span class="comment"># default: 1 (ideal for a checkbox)</span>

<span class="ident">validates_confirmation_of</span> <span class="symbol">:password</span>
<span class="comment"># the fields password and password_confirmation must match</span>

<span class="ident">validates_uniqueness_of</span> <span class="symbol">:user_name</span>              <span class="comment"># user_name has to be unique</span>
<span class="symbol">:scope</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">account_id</span><span class="punct">'</span>  <span class="comment"># Condition: </span>
<span class="comment"># account_id = user.account_id</span>

<span class="ident">validates_format_of</span> <span class="symbol">:email</span>          <span class="comment"># field must match a regular expression</span>
<span class="symbol">:with</span> <span class="punct">=&gt;</span> <span class="punct">/</span><span class="regex">^(+)@((?:[-a-z0-9]+</span><span class="escape">.</span>)+[a-z]{2,})$<span class="punct">/</span><span class="ident">i</span>

<span class="ident">validates_numericality_of</span>   <span class="symbol">:value</span>                  <span class="comment"># value is numeric</span>
<span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly_integer</span> <span class="punct">=&gt;</span> <span class="constant">true</span>
<span class="symbol">:allow_nil</span> <span class="punct">=&gt;</span> <span class="constant">true</span>

<span class="ident">validates_inclusion_of</span>  <span class="symbol">:gender</span><span class="punct">,</span>    <span class="comment"># value is in enumeration</span>
<span class="symbol">:in</span> <span class="punct">=&gt;</span> <span class="punct">%w(</span><span class="string"> m, f </span><span class="punct">)</span>

<span class="ident">validates_exclusion_of</span>  <span class="symbol">:age</span>            <span class="comment"># value is not in Enumeration</span>
<span class="symbol">:in</span> <span class="punct">=&gt;</span> <span class="number">13</span><span class="punct">..</span><span class="number">19</span>   <span class="comment"># don't want any teenagers</span>

<span class="ident">validates_associated</span> <span class="symbol">:relation</span>
<span class="comment"># validates that the associated object is valid</span></pre>
<p>Options for all validations above:</p>
<pre><code>
</code></pre>
<pre><span class="symbol">:message</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">my own errormessage</span><span class="punct">'</span>   <span class="comment"># eigene Fehlermeldung</span>
<span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> n</span>      <span class="punct">=&gt;</span> <span class="symbol">:create</span>                 <span class="comment"># or :update (validates only then)</span>
<span class="symbol">:if</span>      <span class="punct">=&gt;</span> <span class="punct">...</span>                     <span class="comment"># call method oder Proc</span></pre>
<h2 id="calculations">Calculations</h2>
<pre><code>
</code></pre>
<pre><span class="constant">Person</span><span class="punct">.</span><span class="ident">average</span> <span class="symbol">:age</span>
<span class="constant">Person</span><span class="punct">.</span><span class="ident">minimum</span> <span class="symbol">:age</span>
<span class="constant">Person</span><span class="punct">.</span><span class="ident">maximum</span> <span class="symbol">:age</span>
<span class="constant">Person</span><span class="punct">.</span><span class="ident">sum</span> <span class="symbol">:salary</span><span class="punct">,</span> <span class="symbol">:group</span> <span class="punct">=&gt;</span> <span class="symbol">:last_name</span></pre>
<h2 id="find">Find</h2>
<pre><code>
</code></pre>
<pre><span class="ident">find</span><span class="punct">(</span><span class="number">42</span><span class="punct">)</span>        <span class="comment"># object with ID 42</span>
<span class="ident">find</span><span class="punct">([</span><span class="number">37</span><span class="punct">,</span> <span class="number">42</span><span class="punct">])</span>  <span class="comment"># Array with the objects with id 37, 42</span>
<span class="ident">find</span> <span class="symbol">:all</span>
<span class="ident">find</span> <span class="symbol">:first</span><span class="punct">,</span>
<span class="symbol">:conditions</span> <span class="punct">=&gt;</span> <span class="punct">[</span> <span class="punct">"</span><span class="string">name = ?</span><span class="punct">",</span> <span class="punct">"</span><span class="string">Hans</span><span class="punct">"</span> <span class="punct">]</span>   <span class="comment"># finds the first record with </span>
<span class="comment"># the matching condition</span></pre>
<p>more parameters for find:</p>
<pre><code>
</code></pre>
<pre><span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">name DESC</span><span class="punct">'</span>       <span class="comment"># sql fragment for sorting</span>
<span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ffset</span> <span class="punct">=&gt;</span> <span class="number">20</span>               <span class="comment"># starts with entry 20</span>
<span class="symbol">:limit</span> <span class="punct">=&gt;</span> <span class="number">10</span>                <span class="comment"># only return 10 objects</span>
<span class="symbol">:group</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">name</span><span class="punct">'</span>            <span class="comment"># sql fragment GROUP BY</span>
<span class="symbol">:joins</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">LEFT JOIN ...</span><span class="punct">'</span>   <span class="comment"># additional LEFT JOIN (rarely used)</span>
<span class="symbol">:include</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:account</span><span class="punct">,</span> <span class="symbol">:friends</span><span class="punct">]</span>    <span class="comment"># LEFT OUTER JOIN with these model</span>
<span class="symbol">:include</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:groups</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:members=</span><span class="punct">&gt;</span> <span class="punct">{</span> <span class="symbol">:favorites</span> <span class="punct">}</span> <span class="punct">}</span> <span class="punct">}</span>
<span class="symbol">:select</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:name</span><span class="punct">,</span> <span class="symbol">:adress</span><span class="punct">]</span>     <span class="comment"># instead of SELECT * FROM</span>
<span class="symbol">:readonly</span> <span class="punct">=&gt;</span> <span class="constant">true</span>               <span class="comment"># objects are write protected</span></pre>
<h2 id="scope">Scope</h2>
<pre><code>
</code></pre>
<pre><span class="constant">Developer</span><span class="punct">.</span><span class="ident">with_scope</span><span class="punct">(</span><span class="symbol">:find</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:conditions</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">salary &gt; 10000</span><span class="punct">",</span> <span class="symbol">:limit</span> <span class="punct">=&gt;</span> <span class="number">10</span> <span class="punct">})</span> <span class="keyword">do</span>
<span class="constant">Developer</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:all</span><span class="punct">)</span>     <span class="comment"># =&gt; SELECT * FROM developers WHERE (salary &gt; 10000) LIMIT 10</span>

<span class="comment"># inner rule is used. (all previous parameters are ignored)</span>
<span class="constant">Developer</span><span class="punct">.</span><span class="ident">with_exclusive_scope</span><span class="punct">(</span><span class="symbol">:find</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:conditions</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">name = 'Jamis'</span><span class="punct">"</span> <span class="punct">})</span> <span class="keyword">do</span>
<span class="constant">Developer</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:all</span><span class="punct">)</span>   <span class="comment"># =&gt; SELECT * FROM developers WHERE (name = 'Jamis')</span>
<span class="keyword">end</span>

<span class="comment"># parameters are merged</span>
<span class="constant">Developer</span><span class="punct">.</span><span class="ident">with_scope</span><span class="punct">(</span><span class="symbol">:find</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:conditions</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">name = 'Jamis'</span><span class="punct">"</span> <span class="punct">})</span> <span class="keyword">do</span>
<span class="constant">Developer</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span><span class="symbol">:all</span><span class="punct">)</span>   <span class="comment"># =&gt; SELECT * FROM developers WHERE </span>
<span class="comment"># (( salary &gt; 10000 ) AND ( name = 'Jamis' )) LIMIT 10</span>
<span class="keyword">end</span>
<span class="keyword">end</span></pre>
<p>for more details and examples, see:</p>
<ul>
<li><a href="http://www.codyfauser.com/articles/2006/02/01/using-with_scope-to-refactor-messy-finders" onclick="pageTracker._trackPageview('/outgoing/www.codyfauser.com/articles/2006/02/01/using-with_scope-to-refactor-messy-finders?referer=');">http://www.codyfauser.com/articles/2006/02/01/using-with_scope-to-refactor-messy-finders</a></li>
<li><a href="http://blog.caboo.se/articles/2006/02/22/nested-with_scope" onclick="pageTracker._trackPageview('/outgoing/blog.caboo.se/articles/2006/02/22/nested-with_scope?referer=');">http://blog.caboo.se/articles/2006/02/22/nested-with_scope</a></li>
</ul>
<h2 id="callbacks">Callbacks</h2>
<p>During the life cycle of an active record object, you can hook into 9 events:</p>
<ul>
<li>(-) save</li>
<li>(-) valid?</li>
<li>(1) before_validation</li>
<li>(2) before_validation_on_create</li>
<li>(-) validate</li>
<li>(-) validate_on_create</li>
<li>(4) after_validation</li>
<li>(5) after_validation_on_create</li>
<li>(6) before_save</li>
<li>(7) before_create</li>
<li>(-) create</li>
<li>(8) after_create</li>
<li>(9) after_save</li>
</ul>
<p>Examples:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">class </span><span class="class">Subscription</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="ident">before_create</span> <span class="symbol">:record_signup</span>
<span class="ident">private</span>
<span class="keyword">def </span><span class="method">record_signup</span>
<span class="constant">self</span><span class="punct">.</span><span class="ident">signed_up_on</span> <span class="punct">=</span> <span class="constant">Date</span><span class="punct">.</span><span class="ident">today</span>
<span class="keyword">end</span>
<span class="keyword">end</span>

<span class="keyword">class </span><span class="class">Firm</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Base</span>
<span class="comment"># Destroys the associated clients and people when the firm is destroyed</span>
<span class="ident">before_destroy</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">record</span><span class="punct">|</span> <span class="constant">Person</span><span class="punct">.</span><span class="ident">destroy_all</span> <span class="punct">"</span><span class="string">firm_id = </span><span class="expr">#{record.id}</span><span class="punct">"</span>   <span class="punct">}</span>
<span class="ident">before_destroy</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">record</span><span class="punct">|</span> <span class="constant">Client</span><span class="punct">.</span><span class="ident">destroy_all</span> <span class="punct">"</span><span class="string">client_of = </span><span class="expr">#{record.id}</span><span class="punct">"</span> <span class="punct">}</span>
<span class="keyword">end</span></pre>
<h2 id="observers">Observers</h2>
<p>The Observer classes letâ€™s you extract the functionality of the callbacks:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">class </span><span class="class">CommentObserver</span> <span class="punct">&lt; </span> <span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">Observer</span>
<span class="keyword">def </span><span class="method">after_save</span><span class="punct">(</span><span class="ident">comment</span><span class="punct">)</span>
<span class="constant">Notifications</span><span class="punct">.</span><span class="ident">deliver_comment</span><span class="punct">("</span><span class="string">admin@do.com</span><span class="punct">",</span> <span class="punct">"</span><span class="string">New comment was posted</span><span class="punct">",</span> <span class="ident">comment</span><span class="punct">)</span>
<span class="keyword">end</span>
<span class="keyword">end</span></pre>
<p>Store observers in app/model/model_observer.rb</p>
<p>Enable observer by putting this in <em>config/environment.rb</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">config</span><span class="punct">.</span><span class="ident">active_record</span><span class="punct">.</span><span class="ident">observers</span> <span class="punct">=</span> <span class="symbol">:comment_observer</span><span class="punct">,</span> <span class="symbol">:signup_observer</span></pre>
<h2 id="migration">Migration</h2>
<pre><code>
</code></pre>
<pre><span class="ident">ruby</span> <span class="ident">sript</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">migration</span> <span class="constant">AddTables</span></pre>
<p>Creates a file <code>db/migrations/001_add_tables</code>. The methods â€œupâ€ and â€œdownâ€ change the db schema</p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">self.up</span>     <span class="comment"># brings db schema to the next version </span>
<span class="comment"># regular table</span>
<span class="ident">create_table</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:force</span> <span class="punct">=&gt;</span> <span class="constant">true</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">t</span><span class="punct">|</span>
<span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:name</span><span class="punct">,</span> <span class="symbol">:string</span>
<span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:age</span><span class="punct">,</span> <span class="symbol">:integer</span><span class="punct">,</span> <span class="punct">{</span> <span class="symbol">:default</span> <span class="punct">=&gt;</span> <span class="number">42</span> <span class="punct">}</span>
<span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:description</span><span class="punct">,</span> <span class="symbol">:text</span>
<span class="comment"># :string, :text, :integer, :float, :datetime, :timestamp, :time, :date, </span>
<span class="comment"># :binary, :boolean</span>
<span class="keyword">end</span>

<span class="comment"># join table for has_and_belongs_to_many (note: no id column!)</span>
<span class="ident">create_table</span> <span class="symbol">:modelas_modelbs</span><span class="punct">,</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="constant">false</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">t</span><span class="punct">|</span>
<span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:modela_id</span><span class="punct">,</span> <span class="symbol">:integer</span>
<span class="ident">t</span><span class="punct">.</span><span class="ident">column</span> <span class="symbol">:modelb_id</span><span class="punct">,</span> <span class="symbol">:integer</span>
<span class="keyword">end</span>

<span class="ident">add_column</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:column</span><span class="punct">,</span> <span class="symbol">:type</span>
<span class="ident">rename_column</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ld_name</span><span class="punct">,</span> <span class="symbol">:new_name</span>
<span class="ident">change_column</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:column</span><span class="punct">,</span> <span class="symbol">:new_type</span>
<span class="ident">execute</span> <span class="punct">"</span><span class="string">SQL Statement</span><span class="punct">"</span>
<span class="ident">add_index</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:column</span><span class="punct">,</span> <span class="symbol">:unique</span> <span class="punct">=&gt;</span> <span class="constant">true</span><span class="punct">,</span> <span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">some_name</span><span class="punct">'</span>
<span class="ident">add_index</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="punct">[</span> <span class="symbol">:column1</span><span class="punct">,</span> <span class="symbol">:column2</span> <span class="punct">]</span>
<span class="keyword">end</span>

<span class="keyword">def </span><span class="method">self.down</span>   <span class="comment"># rollbacks changes</span>
<span class="ident">rename_column</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:new_name</span><span class="punct">,</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ld_name</span>
<span class="ident">remove_column</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:column</span>
<span class="ident">drop_table</span> <span class="symbol">:table</span>
<span class="ident">remove_index</span> <span class="symbol">:table</span><span class="punct">,</span> <span class="symbol">:column</span>
<span class="keyword">end</span></pre>
<p>To execute the migration:</p>
<pre><code>
</code></pre>
<pre><span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:migrate</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:migrate</span> <span class="constant">VERSION</span><span class="punct">=</span><span class="number">14</span>
<span class="ident">rake</span> <span class="ident">db</span><span class="symbol">:migrate</span> <span class="constant">RAILS_ENV</span><span class="punct">=</span><span class="ident">production</span></pre>
<h2 id="unittest">Unit Test</h2>
<pre><code>
</code></pre>
<pre><span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:units</span></pre>
<p>The following assertions are available:</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_kind_of</span> <span class="constant">Class</span><span class="punct">,</span> <span class="attribute">@var</span>  <span class="comment"># same class</span>
<span class="ident">assert</span> <span class="attribute">@var</span>                 <span class="comment"># not nil</span>
<span class="ident">assert_equal</span> <span class="number">1</span><span class="punct">,</span> <span class="attribute">@p</span><span class="punct">.</span><span class="ident">id</span>       <span class="comment"># equality</span>
<span class="ident">assert_match</span> <span class="punct">/</span><span class="ident">regexp</span><span class="punct">/,</span> <span class="ident">test</span> <span class="comment"># regular expression</span>
<span class="attribute">@product</span><span class="punct">.</span><span class="ident">destroy</span>
<span class="ident">assert_raise</span><span class="punct">(</span><span class="constant">ActiveRecord</span><span class="punct">::</span><span class="constant">RecordNotFound</span><span class="punct">)</span> <span class="punct">{</span> <span class="constant">Product</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span> <span class="attribute">@product</span><span class="punct">.</span><span class="ident">id</span> <span class="punct">)</span> <span class="punct">}</span></pre>
<h1 id="controllers">Controllers</h1>
<h2 id="controllermethods">Controller methods</h2>
<p>Each public method in a controller is callable by the (standard) URL scheme /controller/action</p>
<pre><code>
</code></pre>
<pre><span class="keyword">class </span><span class="class">WorldController</span> <span class="punct">&lt; </span> <span class="constant">ApplicationController</span>
<span class="keyword">def </span><span class="method">hello</span>
<span class="ident">render</span> <span class="symbol">:text</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Hello world</span><span class="punct">'</span>
<span class="keyword">end</span></pre>
<p>Parameters are stored in the params hash:</p>
<pre><code>
</code></pre>
<pre><span class="punct">/</span><span class="regex">world</span><span class="punct">/</span><span class="ident">hello</span><span class="punct">/</span><span class="number">1</span><span class="char">?f</span><span class="ident">oo</span><span class="punct">=</span><span class="ident">bar</span>
<span class="ident">id</span> <span class="punct">=</span> <span class="ident">params</span><span class="punct">[</span><span class="symbol">:id</span><span class="punct">]</span>     <span class="comment"># 1</span>
<span class="ident">foo</span> <span class="punct">=</span> <span class="ident">params</span><span class="punct">[</span><span class="symbol">:foo</span><span class="punct">]</span>   <span class="comment"># bar</span></pre>
<p>Instance variables defined in the the controllers methods are available to the corresponding view templates:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">show</span>
<span class="attribute">@person</span> <span class="punct">=</span> <span class="constant">Person</span><span class="punct">.</span><span class="ident">find</span><span class="punct">(</span> <span class="ident">params</span><span class="punct">[</span><span class="symbol">:id</span><span class="punct">])</span>
<span class="keyword">end</span></pre>
<p>Distinguish the type of response accepted:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">index</span>
<span class="attribute">@posts</span> <span class="punct">=</span> <span class="constant">Post</span><span class="punct">.</span><span class="ident">find</span> <span class="symbol">:all</span>

<span class="ident">respond_to</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">type</span><span class="punct">|</span>
<span class="ident">type</span><span class="punct">.</span><span class="ident">html</span> <span class="comment"># using defaults, which will render weblog/index.rhtml</span>
<span class="ident">type</span><span class="punct">.</span><span class="ident">xml</span>  <span class="punct">{</span> <span class="ident">render</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">index.rxml</span><span class="punct">"</span> <span class="punct">}</span>
<span class="ident">type</span><span class="punct">.</span><span class="ident">js</span>   <span class="punct">{</span> <span class="ident">render</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">index.rjs</span><span class="punct">"</span> <span class="punct">}</span>
<span class="keyword">end</span>
<span class="keyword">end</span></pre>
<h2 id="render">Render</h2>
<p>Usually the view template with the same name as the controller method is used to render the results</p>
<p><em>Action</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">some_action</span><span class="punct">'</span>   <span class="comment"># the default. Does not need to be specified</span>
<span class="comment"># in a controller method called "some_action"</span>
<span class="ident">render</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">another_action</span><span class="punct">',</span> <span class="symbol">:layout</span> <span class="punct">=&gt;</span> <span class="constant">false</span>
<span class="ident">render</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">some_action</span><span class="punct">',</span> <span class="symbol">:layout</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">another_layout</span><span class="punct">'</span></pre>
<p><em>Partials</em></p>
<p>Partials are stored in files called â€œ_subformnameâ€ ( _error, _subform, _listitem)</p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">subform</span><span class="punct">'</span>
<span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">error</span><span class="punct">',</span> <span class="symbol">:status</span> <span class="punct">=&gt;</span> <span class="number">500</span>
<span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">subform</span><span class="punct">',</span> <span class="symbol">:locals</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:variable</span> <span class="punct">=&gt;</span> <span class="attribute">@other_variable</span> <span class="punct">}</span>
<span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">listitem</span><span class="punct">',</span> <span class="symbol">:collection</span> <span class="punct">=&gt;</span> <span class="attribute">@list</span>
<span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">listitem</span><span class="punct">',</span> <span class="symbol">:collection</span> <span class="punct">=&gt;</span> <span class="attribute">@list</span><span class="punct">,</span> <span class="symbol">:spacer_template</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">list_divider</span><span class="punct">'</span></pre>
<p><em>Template</em></p>
<p>Like rendering an action, but finds the template based on the template root (app/views)</p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:template</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">weblog/show</span><span class="punct">'</span>  <span class="comment"># renders app/views/weblog/show</span></pre>
<p><em>File</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:file</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">/path/to/some/file.rhtml</span><span class="punct">'</span>
<span class="ident">render</span> <span class="symbol">:file</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">/path/to/some/filenotfound.rhtml</span><span class="punct">',</span> <span class="ident">status</span> <span class="punct">=&gt;</span> <span class="number">404</span><span class="punct">,</span> <span class="symbol">:layout</span> <span class="punct">=&gt;</span> <span class="constant">true</span></pre>
<p><em>Text</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:text</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">Hello World</span><span class="punct">"</span>
<span class="ident">render</span> <span class="symbol">:text</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">This is an error</span><span class="punct">",</span> <span class="symbol">:status</span> <span class="punct">=&gt;</span> <span class="number">500</span>
<span class="ident">render</span> <span class="symbol">:text</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">Let's use a layout</span><span class="punct">",</span> <span class="symbol">:layout</span> <span class="punct">=&gt;</span> <span class="constant">true</span>
<span class="ident">render</span> <span class="symbol">:text</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Specific layout</span><span class="punct">',</span> <span class="symbol">:layout</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">special</span><span class="punct">'</span></pre>
<p><em>Inline Template</em></p>
<p>Uses ERb to render the â€œminiatureâ€ template</p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:inline</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">&lt; %= 'hello , ' * 3 + 'again' %&gt;</span><span class="punct">"</span>
<span class="ident">render</span> <span class="symbol">:inline</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">&lt; %= 'hello ' + name %&gt;</span><span class="punct">",</span> <span class="symbol">:locals</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:name</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">david</span><span class="punct">"</span> <span class="punct">}</span></pre>
<p><em>Nothing</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:nothing</span>
<span class="ident">render</span> <span class="symbol">:nothing</span><span class="punct">,</span> <span class="symbol">:status</span> <span class="punct">=&gt;</span> <span class="number">403</span>    <span class="comment"># forbidden</span></pre>
<p><em>RJS</em></p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">refresh</span>
<span class="ident">render</span> <span class="symbol">:update</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">page</span><span class="punct">|</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">replace_html</span>  <span class="punct">'</span><span class="string">user_list</span><span class="punct">',</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">user</span><span class="punct">',</span> <span class="symbol">:collection</span> <span class="punct">=&gt;</span> <span class="attribute">@users</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">visual_effect</span> <span class="symbol">:highlight</span><span class="punct">,</span> <span class="punct">'</span><span class="string">user_list</span><span class="punct">'</span>
<span class="keyword">end</span>
<span class="keyword">end</span></pre>
<p><em>Change the content-type:</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">atom.rxml</span><span class="punct">",</span> <span class="symbol">:content_type</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">application/atom+xml</span><span class="punct">"</span></pre>
<h2 id="urlrouting">URL Routing</h2>
<p>In config/routes.rb</p>
<pre><code>
</code></pre>
<pre><span class="ident">map</span><span class="punct">.</span><span class="ident">connect</span> <span class="punct">'</span><span class="string"><span class="punct">',</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">posts</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">list</span><span class="punct">'</span> <span class="comment"># default</span>
<span class="ident">map</span><span class="punct">.</span><span class="ident">connect</span> <span class="punct">'</span><span class="string">:action/:controller/:id</span><span class="punct">'</span>
<span class="ident">map</span><span class="punct">.</span><span class="ident">connect</span> <span class="punct">'</span><span class="string">tasks/:year/:month</span><span class="punct">',</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">tasks</span><span class="punct">',</span>
<span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">by_date</span><span class="punct">',</span>
<span class="symbol">:month</span> <span class="punct">=&gt;</span> <span class="constant">nil</span><span class="punct">,</span> <span class="symbol">:year</span> <span class="punct">=&gt;</span> <span class="constant">nil</span><span class="punct">,</span>
<span class="symbol">:requirements</span> <span class="punct">=&gt;</span> <span class="punct">{</span><span class="symbol">:year</span> <span class="punct">=&gt;</span> <span class="punct">/</span><span class="escape">d</span>{4}<span class="punct">/,</span>
<span class="symbol">:month</span> <span class="punct">=&gt;</span> <span class="punct">/</span><span class="escape">d</span>{1,2}<span class="punct">/</span> <span class="punct">}</span></span></pre>
<h2 id="filter">Filter</h2>
<p>Filters can change a request before or after the controller. They can for example be used for authentication, encryption or compression.</p>
<pre><code>
</code></pre>
<pre><span class="ident">before_filter</span> <span class="symbol">:login_required</span><span class="punct">,</span> <span class="symbol">:except</span> <span class="punct">=&gt;</span> <span class="punct">[</span> <span class="symbol">:login</span> <span class="punct">]</span>
<span class="ident">before_filter</span> <span class="symbol">:authenticate</span><span class="punct">,</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly</span> <span class="punct">=&gt;</span> <span class="punct">[</span> <span class="symbol">:edit</span><span class="punct">,</span> <span class="symbol">:delete</span> <span class="punct">]</span>
<span class="ident">after_filter</span> <span class="symbol">:compress</span></pre>
<p>Itâ€™s also possible to use a Proc for a really small filter action:</p>
<pre><code>
</code></pre>
<pre><span class="ident">before_filter</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">controller</span><span class="punct">|</span> <span class="constant">false</span> <span class="keyword">if</span> <span class="ident">controller</span><span class="punct">.</span><span class="ident">params</span><span class="punct">["</span><span class="string">stop_action</span><span class="punct">"]</span> <span class="punct">}</span></pre>
<p>Change the order of your filters by using <code>prepend_before_filter</code> and <code>prepend_after_filter</code> (like <code>prepend_before_filter :some_filter</code> which will put the <code>some_filter</code> at the beginning of the filter chain)</p>
<p>If you define a filter in a super class, you can skip it in the subclass:</p>
<pre><code>
</code></pre>
<pre><span class="ident">skip_before_filter</span> <span class="symbol">:some_filter</span>
<span class="ident">skip_after_filter</span> <span class="symbol">:some_filter</span></pre>
<h2 id="sessionflash">Session / Flash</h2>
<p>To save data across multiple requests, you can use either the <em>session</em> or the <em>flash</em> hashes. A flash stores a value (normally text) until the next request, while a session stores data during the complete session.</p>
<pre><code>
</code></pre>
<pre><span class="ident">session</span><span class="punct">[</span><span class="symbol">:user</span><span class="punct">]</span> <span class="punct">=</span> <span class="attribute">@user</span>
<span class="ident">flash</span><span class="punct">[</span><span class="symbol">:message</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">Data was saved successfully</span><span class="punct">"</span>

<span class="punct">&lt; %=</span><span class="string"> link_to "login", :action </span><span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">login</span><span class="punct">'</span> <span class="keyword">unless</span> <span class="ident">session</span><span class="punct">[</span><span class="symbol">:user</span><span class="punct">]</span> <span class="punct">%&gt;</span><span class="string">
&lt; % if flash[:message] %</span><span class="punct">&gt;</span>
<span class="punct">&lt; </span><span class="ident">div</span><span class="punct">&gt;&lt; %=</span><span class="string"> h flash[:message] %&gt;
&lt; % end %&gt;</span></pre>
<h3 id="sessionmanagement">Session management</h3>
<p>Itâ€™s possible to turn off session management:</p>
<pre><code>
</code></pre>
<pre><span class="ident">session</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ff</span>                        <span class="comment"># turn session management off                        </span>
<span class="ident">session</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ff</span><span class="punct">,</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly</span> <span class="punct">=&gt;</span> <span class="symbol">:action</span>      <span class="comment"># only for this :action</span>
<span class="ident">session</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ff</span><span class="punct">,</span> <span class="symbol">:except</span> <span class="punct">=&gt;</span> <span class="symbol">:action</span>    <span class="comment"># except for this action</span>
<span class="ident">session</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly</span> <span class="punct">=&gt;</span> <span class="symbol">:foo</span><span class="punct">,</span>              <span class="comment"># only for :foo when doing HTTPS</span>
<span class="symbol">:session_secure</span> <span class="punct">=&gt;</span> <span class="constant">true</span>
<span class="ident">session</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ff</span><span class="punct">,</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly</span> <span class="punct">=&gt;</span> <span class="symbol">:foo</span><span class="punct">,</span>        <span class="comment"># off for foo, if uses as Web Service</span>
<span class="symbol">:if</span> <span class="punct">=&gt;</span> <span class="constant">Proc</span><span class="punct">.</span><span class="ident">new</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">req</span><span class="punct">|</span> <span class="ident">req</span><span class="punct">.</span><span class="ident">parameters</span><span class="punct">[</span><span class="symbol">:ws</span><span class="punct">]</span> <span class="punct">}</span></pre>
<h2 id="cookies">Cookies</h2>
<p><em>Setting</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">cookies</span><span class="punct">[</span><span class="symbol">:user_name</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">david</span><span class="punct">"</span> <span class="comment"># =&gt; Will set a simple session cookie</span>
<span class="ident">cookies</span><span class="punct">[</span><span class="symbol">:login</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">{</span> <span class="symbol">:value</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">XJ-122</span><span class="punct">",</span> <span class="symbol">:expires</span> <span class="punct">=&gt;</span> <span class="constant">Time</span><span class="punct">.</span><span class="ident">now</span> <span class="punct">+</span> <span class="number">3600</span><span class="punct">}</span>
<span class="comment"># =&gt; Will set a cookie that expires in 1 hour</span></pre>
<p><em>Reading</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">cookies</span><span class="punct">[</span><span class="symbol">:user_name</span><span class="punct">]</span> <span class="comment"># =&gt; "david"</span>
<span class="ident">cookies</span><span class="punct">.</span><span class="ident">size</span>         <span class="comment"># =&gt; 2</span></pre>
<p><em>Deleting</em></p>
<pre><code>
</code></pre>
<pre><span class="ident">cookies</span><span class="punct">.</span><span class="ident">delete</span> <span class="symbol">:user_name</span></pre>
<p>All the option symbols for setting cookies are:</p>
<ul>
<li>value &#8211; the cookieâ€™s value or list of values (as an array).</li>
<li>path &#8211; the path for which this cookie applies.  Defaults to the root of the application.</li>
<li>domain &#8211; the domain for which this cookie applies.</li>
<li>expires &#8211; the time at which this cookie expires, as a +Time+ object.</li>
<li>secure &#8211; whether this cookie is a secure cookie or not (default to false). Secure cookies are only transmitted to HTTPS servers.</li>
</ul>
<h2 id="fileuploads">File Uploads</h2>
<p>Define a multipart form in your view:</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> form_tag( { :action </span><span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">upload</span><span class="punct">'</span> <span class="punct">},</span> <span class="symbol">:multipart</span> <span class="punct">=&gt;</span> <span class="constant">true</span> <span class="punct">)</span> <span class="punct">-%&gt;</span><span class="string">
Upload file: &lt; %= file_field( "form", "file" ) -%</span><span class="punct">&gt;</span>
<span class="punct">&lt; </span><span class="ident">br</span> <span class="punct">/&gt;</span>
<span class="punct">&lt; %=</span><span class="string"> submit_tag( "Upload file" ) -%&gt;
&lt; %</span><span class="punct">=</span> <span class="ident">end_form_tag</span> <span class="punct">%&gt;</span></pre>
<p>Handle the upload in the controller:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">upload</span>
<span class="ident">file_field</span> <span class="punct">=</span> <span class="attribute">@params</span><span class="punct">['</span><span class="string">form</span><span class="punct">']['</span><span class="string">file</span><span class="punct">']</span> <span class="keyword">rescue</span> <span class="constant">nil</span>
<span class="comment"># file_field is a StringIO object</span>
<span class="ident">file_field</span><span class="punct">.</span><span class="ident">content_type</span> <span class="comment"># 'text/csv'</span>
<span class="ident">file_field</span><span class="punct">.</span><span class="ident">full_original_filename</span>
<span class="punct">...</span>
<span class="keyword">end</span></pre>
<h1 id="views">Views</h1>
<h2 id="viewtemplates">View Templates</h2>
<p>All view templates are stored in <code>app/views/controllername</code>. The extension determines what kind of template format is used:</p>
<ul>
<li><em>rhtml</em> Ruby HTML (using ERB)</li>
<li><em>rxml</em> Ruby XML (using Builder)</li>
<li><em>rjs</em> Ruby JavaScript</li>
</ul>
<p>All instance variables of the controller are available to the view. In addition, the following special objects can be accessed:</p>
<ul>
<li><em>headers</em> The Headers of the outgoing response</li>
<li><em>request</em> The incoming request object</li>
<li><em>response</em> The outgoing response object</li>
<li><em>params</em> The parameter hash</li>
<li><em>session</em> The session hash</li>
<li><em>controller</em> The current controller</li>
</ul>
<h2 id="html">HTML</h2>
<p>HTMl mixed with Ruby using tags. All of Ruby is available for programming</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %</span> <span class="punct">%&gt;</span><span class="string">   # executes the Ruby code
&lt; %= %</span><span class="punct">&gt;</span>  <span class="comment"># executes the Ruby code and displays the result</span>

<span class="punct">&lt; </span><span class="ident">ul</span><span class="punct">&gt;</span>
<span class="punct">&lt; %</span> <span class="attribute">@products</span><span class="punct">.</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">p</span><span class="punct">|</span> <span class="punct">%&gt;</span><span class="string">
</span><span class="punct">&gt;&lt; %=</span><span class="string"> h @p.name %&gt;</span>

&lt; % end %&gt;</pre>
<p>The output of anything in &lt; %= %&gt; tags is directly copied to the HTML output stream. To secure against HTML injection, use the h() function to <em>html_escape</em> the output</p>
<h2 id="rxml">RXML</h2>
<p>Creates XML files</p>
<pre><code>
</code></pre>
<pre><span class="ident">xml</span><span class="punct">.</span><span class="ident">instruct!</span>               <span class="comment"># &lt; ?xml version="1.0" encoding="UTF-8"?&gt;</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">comment!</span> <span class="punct">"</span><span class="string">a comment</span><span class="punct">"</span>    <span class="comment"># <!-- a comment --></span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">feed</span> <span class="punct">"</span><span class="string">xmlns</span><span class="punct">"</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">http://www.w3.org/2005/Atom</span><span class="punct">"</span> <span class="keyword">do</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">title</span> <span class="punct">"</span><span class="string">My Atom Feed</span><span class="punct">"</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">subtitle</span> <span class="ident">h</span><span class="punct">(</span><span class="attribute">@feed</span><span class="punct">.</span><span class="ident">subtitle</span><span class="punct">),</span> <span class="punct">"</span><span class="string">type</span><span class="punct">"</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">html</span><span class="punct">'</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">link</span> <span class="ident">url_for</span><span class="punct">(</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly_path</span> <span class="punct">=&gt;</span> <span class="constant">false</span><span class="punct">,</span>
<span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">feed</span><span class="punct">',</span>
<span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">atom</span><span class="punct">'</span> <span class="punct">)</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">updated</span> <span class="attribute">@updated</span><span class="punct">.</span><span class="ident">iso8601</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">author</span> <span class="keyword">do</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">name</span> <span class="punct">"</span><span class="string">Jens-Christian Fischer</span><span class="punct">"</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">email</span> <span class="punct">"</span><span class="string">jcfischer@gmail.com</span><span class="punct">"</span>
<span class="keyword">end</span>
<span class="attribute">@entries</span><span class="punct">.</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">entry</span><span class="punct">|</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">entry</span> <span class="keyword">do</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">title</span> <span class="ident">entry</span><span class="punct">.</span><span class="ident">title</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">link</span> <span class="punct">"</span><span class="string">href</span><span class="punct">"</span> <span class="punct">=&gt;</span> <span class="ident">url_for</span> <span class="punct">(</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly_path</span> <span class="punct">=&gt;</span> <span class="constant">false</span><span class="punct">,</span>
<span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">entries</span><span class="punct">',</span>
<span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">show</span><span class="punct">',</span>
<span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="ident">entry</span> <span class="punct">)</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">id</span> <span class="ident">entry</span><span class="punct">.</span><span class="ident">urn</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">updated</span> <span class="ident">entry</span><span class="punct">.</span><span class="ident">updated</span><span class="punct">.</span><span class="ident">iso8601</span>
<span class="ident">xml</span><span class="punct">.</span><span class="ident">summary</span> <span class="ident">h</span><span class="punct">(</span><span class="ident">entry</span><span class="punct">.</span><span class="ident">summary</span><span class="punct">)</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="keyword">end</span></pre>
<p>for more details see: <a href="http://rubyforge.org/projects/builder/" onclick="pageTracker._trackPageview('/outgoing/rubyforge.org/projects/builder/?referer=');">http://rubyforge.org/projects/builder/</a></p>
<h2 id="rjs">RJS</h2>
<p>In addition to HTML and XML templates, Rails also understands <strong>JavaScript Templates</strong>. They allow you to easily create complex alterations of the displayed page. You can manipulate a <em>page</em> element with the following methods:</p>
<p><em>select</em> Select a DOM element for further processing</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">select</span><span class="punct">('</span><span class="string">pattern</span><span class="punct">')</span> <span class="comment"># selects an item on the page through a CSS pattern</span>
<span class="comment"># select('p'), select('p.welcome b')</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">select</span><span class="punct">('</span><span class="string">div.header em</span><span class="punct">').</span><span class="ident">first</span><span class="punct">.</span><span class="ident">hide</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">select</span><span class="punct">('</span><span class="string">#items li</span><span class="punct">').</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">value</span><span class="punct">|</span>
<span class="ident">value</span><span class="punct">.</span><span class="ident">hide</span>
<span class="keyword">end</span></pre>
<p><em>insert_html</em> Inserts content into the DOM at a specific position</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">insert_html</span> <span class="symbol">:position</span><span class="punct">,</span> <span class="ident">id</span><span class="punct">,</span> <span class="ident">content</span></pre>
<p>position can be one of the following:</p>
<ul>
<li><code>:top</code></li>
<li><code>:bottom</code></li>
<li><code>:before</code></li>
<li><code>:after</code></li>
</ul>
<p>Examples:</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">insert_html</span> <span class="symbol">:bottom</span><span class="punct">,</span> <span class="punct">'</span><span class="string">list</span><span class="punct">',</span> <span class="punct">'</span><span class="string">
<li>last item</li>

</span><span class="punct">'</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">insert_html</span> <span class="symbol">:before</span><span class="punct">,</span> <span class="punct">'</span><span class="string">tasks</span><span class="punct">',</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">task</span><span class="punct">'</span></pre>
<p><em>replace_html</em> Replaces the innerHTML of the specified DOM element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">replace_html</span> <span class="punct">'</span><span class="string">title</span><span class="punct">',</span> <span class="punct">"</span><span class="string">This is the new title</span><span class="punct">"</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">replace_html</span> <span class="punct">'</span><span class="string">person-45</span><span class="punct">',</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">person</span><span class="punct">',</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> bject</span> <span class="punct">=&gt;</span> <span class="attribute">@person</span></pre>
<p><em>replace</em> Replaces the â€œouter HTMLâ€, (i.e. the entire element) of the specified DOM element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">replace</span> <span class="punct">'</span><span class="string">task</span><span class="punct">',</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">task</span><span class="punct">',</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> bject</span> <span class="punct">=&gt;</span> <span class="attribute">@task</span></pre>
<p><em>remove</em> Removes the specified DOM element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">remove</span> <span class="punct">'</span><span class="string">edit-button</span><span class="punct">'</span></pre>
<p><em>hide</em> Hides the specified DOM element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">hide</span> <span class="punct">'</span><span class="string">some-element</span><span class="punct">'</span></pre>
<p><em>show</em> Shows the specified DOM element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">show</span> <span class="punct">'</span><span class="string">some-element</span><span class="punct">'</span></pre>
<p><em>toggle</em> Toggle the visibility of a DOM element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">toggle</span> <span class="punct">'</span><span class="string">some-element</span><span class="punct">'</span></pre>
<p><em>alert</em> Display an alert box</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">alert</span> <span class="punct">'</span><span class="string">Hello world</span><span class="punct">'</span></pre>
<p><em>redirect_to</em> Redirects the browser to a given location</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">redirect_to</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">blog</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">show</span><span class="punct">',</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="attribute">@post</span></pre>
<p><em>call</em> Calls another JavaScript function</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">call</span> <span class="ident">foo</span><span class="punct">,</span> <span class="number">1</span><span class="punct">,</span> <span class="number">2</span></pre>
<p><em>assign</em> Assigns a value to a JS variable</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">assign</span> <span class="punct">"</span><span class="string">foo</span><span class="punct">",</span> <span class="number">42</span></pre>
<p><em>&lt; &lt;</em> Writes raw JavaScript to the page</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span> <span class="punct">&lt; &lt;</span> <span class="punct">"</span><span class="string">alert('hello world);</span><span class="punct">"</span></pre>
<p><em>delay</em> Delays the code in the block by a number of seconds</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">delay</span><span class="punct">(</span><span class="number">10</span><span class="punct">)</span> <span class="keyword">do</span>
<span class="ident">page</span><span class="punct">.</span><span class="ident">visual_effect</span> <span class="symbol">:fade</span><span class="punct">,</span> <span class="punct">'</span><span class="string">notice</span><span class="punct">'</span>
<span class="keyword">end</span></pre>
<p><em>visual_effect</em> Calls a Scriptaculous effect</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">visual_effect</span> <span class="symbol">:highlight</span><span class="punct">,</span> <span class="punct">'</span><span class="string">notice</span><span class="punct">',</span> <span class="symbol">:duration</span> <span class="punct">=&gt;</span> <span class="number">2</span></pre>
<p><em>sortable</em> Create a sortable element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">sortable</span> <span class="punct">'</span><span class="string">my_list</span><span class="punct">',</span> <span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">order</span><span class="punct">'</span> <span class="punct">}</span></pre>
<p><em>dragable</em> Create a dragable element</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">dragable</span> <span class="punct">'</span><span class="string">my_image</span><span class="punct">',</span> <span class="symbol">:revert</span> <span class="punct">=&gt;</span> <span class="constant">true</span></pre>
<p><em>drop_receiving</em> Create an element for receiving drops</p>
<pre><code>
</code></pre>
<pre><span class="ident">page</span><span class="punct">.</span><span class="ident">drop_recieving</span> <span class="punct">'</span><span class="string">my_cart</span><span class="punct">',</span> <span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">cart</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">add</span><span class="punct">'</span> <span class="punct">}</span></pre>
<h2 id="helpers">Helpers</h2>
<p>Small functions, usually used for displaying data, can be extracted to helpers. Each view has itâ€™s own helper class (in <em>app/helpers</em>). Common functionality is stored in <em>app/helpers/application_helper.rb</em></p>
<h2 id="links">Links</h2>
<pre><code>
</code></pre>
<pre><span class="ident">link_to</span> <span class="punct">"</span><span class="string">Name</span><span class="punct">",</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">post</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">show</span><span class="punct">',</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="attribute">@post</span><span class="punct">.</span><span class="ident">id</span>
<span class="ident">link_to</span> <span class="punct">"</span><span class="string">Delete</span><span class="punct">",</span> <span class="punct">{</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">admin</span><span class="punct">",</span>
<span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">delete</span><span class="punct">",</span>
<span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="attribute">@post</span> <span class="punct">},</span>
<span class="punct">{</span> <span class="symbol">:class</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">css-class</span><span class="punct">',</span>
<span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">css-id</span><span class="punct">',</span>
<span class="symbol">:confirm</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">Are you sure?</span><span class="punct">"</span> <span class="punct">}</span>

<span class="ident">image_tag</span> <span class="punct">"</span><span class="string">spinner.png</span><span class="punct">",</span> <span class="symbol">:class</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">image</span><span class="punct">",</span> <span class="symbol">:alt</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">Spinner</span><span class="punct">"</span>

<span class="ident">mail_to</span> <span class="punct">"</span><span class="string">info@invisible.ch</span><span class="punct">",</span> <span class="punct">"</span><span class="string">send mail</span><span class="punct">",</span>
<span class="symbol">:subject</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">Support request by </span><span class="expr">#{@user.name}</span><span class="punct">",</span>
<span class="symbol">:cc</span> <span class="punct">=&gt;</span> <span class="attribute">@user</span><span class="punct">.</span><span class="ident">email</span><span class="punct">,</span>
<span class="symbol">:body</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">....</span><span class="punct">',</span>
<span class="symbol">:encoding</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">javascript</span><span class="punct">"</span>

<span class="ident">stylesheet_link_tag</span> <span class="punct">"</span><span class="string">scaffold</span><span class="punct">",</span> <span class="punct">"</span><span class="string">admin</span><span class="punct">",</span> <span class="symbol">:media</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">all</span><span class="punct">"</span></pre>
<h2 id="htmlforms">HTML Forms</h2>
<h3 id="form_for">Form_for</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %</span> <span class="ident">form_for</span> <span class="symbol">:person</span><span class="punct">,</span> <span class="attribute">@person</span><span class="punct">,</span> <span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">update</span><span class="punct">"</span> <span class="punct">},</span>
<span class="symbol">:html</span> <span class="punct">=&gt;</span> <span class="punct">{</span><span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">person_form</span><span class="punct">'}</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">f</span><span class="punct">|</span> <span class="punct">%&gt;</span><span class="string">
First name: &lt; %= f.text_field :first_name %</span><span class="punct">&gt;</span>
<span class="constant">Last</span> <span class="ident">name</span> <span class="punct">:</span> <span class="punct">&lt; %=</span><span class="string"> f.text_field :last_name %&gt;
Age       : &lt; %</span><span class="punct">=</span> <span class="ident">f</span><span class="punct">.</span><span class="ident">text_field</span> <span class="symbol">:age</span><span class="punct">,</span> <span class="symbol">:size</span> <span class="punct">=&gt;</span> <span class="number">2</span> <span class="punct">%&gt;</span><span class="string">
Biography : &lt; %= f.text_area :biography %</span><span class="punct">&gt;</span>
<span class="constant">Admin</span><span class="punct">?</span>    <span class="punct">:</span> <span class="punct">&lt; %=</span><span class="string"> f.check_box :admin %&gt;
&lt; % end %&gt;</span></pre>
<p>You can use all the following functions in the form_for and remote_form_for blocks and leave out the model part:</p>
<h3 id="fields_for">fields_for ###</h3>
<p>Same as form_for, but does not wrap it in form tags. allows you to have fields for secondary objects:</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %</span> <span class="ident">form_for</span> <span class="symbol">:person</span><span class="punct">,</span> <span class="attribute">@person</span><span class="punct">,</span> <span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">update</span><span class="punct">"</span> <span class="punct">}</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">person_form</span><span class="punct">|</span> <span class="punct">%&gt;</span><span class="string">
First name: &lt; %= person_form.text_field :first_name %</span><span class="punct">&gt;</span>
<span class="constant">Last</span> <span class="ident">name</span> <span class="punct">:</span> <span class="punct">&lt; %=</span><span class="string"> person_form.text_field :last_name %&gt;

&lt; % fields_for :permission, @person.permission do |permission_fields| %&gt;
Admin?  : &lt; %</span><span class="punct">=</span> <span class="ident">permission_fields</span><span class="punct">.</span><span class="ident">check_box</span> <span class="symbol">:admin</span> <span class="punct">%&gt;</span><span class="string">
&lt; % end %</span><span class="punct">&gt;</span>
<span class="punct">&lt; %</span> <span class="keyword">end</span> <span class="punct">%&gt;</span></pre>
<h3 id="form">Form</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> form_tag :action </span><span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">update</span><span class="punct">',</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="attribute">@some_object</span> <span class="punct">%&gt;</span><span class="string">

&lt; %= form_tag( { :action =</span><span class="punct">&gt;</span> <span class="symbol">:save</span><span class="punct">,</span> <span class="punct">},</span> <span class="punct">{</span> <span class="symbol">:method</span> <span class="punct">=&gt;</span> <span class="symbol">:post</span> <span class="punct">})</span> <span class="punct">%&gt;</span></pre>
<p>creates a form tag with the specified action, makes it a <strong>post</strong> request.</p>
<p>Use <code>:multipart =&gt; true</code> to define a Mime-Multipart form (for file uploads)</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> form_tag( {:action </span><span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">upload</span><span class="punct">'},</span> <span class="symbol">:multipart</span> <span class="punct">=&gt;</span> <span class="constant">true</span> <span class="punct">)</span> <span class="punct">%&gt;</span></pre>
<h3 id="textfields">Text fields</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> text_field :modelname, :attribute_name, options  %&gt;</span></pre>
<p>creates a text input field of the form:</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">type</span><span class="punct">="</span><span class="string">text</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">modelname[attribute_name]</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">attributename</span><span class="punct">"</span> <span class="punct">/&gt;</span></pre>
<p>Example:</p>
<pre><code>
</code></pre>
<pre><span class="ident">text_field</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">title</span><span class="punct">",</span> <span class="punct">"</span><span class="string">size</span><span class="punct">"</span> <span class="punct">=&gt;</span> <span class="number">20</span>
<span class="punct">&lt; </span><span class="ident">input</span>  <span class="ident">type</span><span class="punct">="</span><span class="string">text</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">post_title</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[title]</span><span class="punct">"</span>
<span class="ident">size</span><span class="punct">="</span><span class="string">20</span><span class="punct">"</span> <span class="ident">value</span><span class="punct">="</span><span class="expr">#{@post.title}</span><span class="punct">"</span> <span class="punct">/&gt;</span>

<span class="punct">&lt; %=</span><span class="string"> hidden_field ... %&gt;</span></pre>
<p>creates a hidden field</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> password_field ... %&gt;</span></pre>
<p>creates a password field (all input shown as stars)</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> file_field ... %&gt;</span></pre>
<p>creates a file field</p>
<h3 id="textarea">Textarea</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> text_area ... %&gt;</span></pre>
<p>creates a text area. Example:</p>
<pre><code>
</code></pre>
<pre><span class="ident">text_area</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">body</span><span class="punct">",</span> <span class="punct">"</span><span class="string">cols</span><span class="punct">"</span> <span class="punct">=&gt;</span> <span class="number">20</span><span class="punct">,</span> <span class="punct">"</span><span class="string">rows</span><span class="punct">"</span> <span class="punct">=&gt;</span> <span class="number">40</span>
<span class="punct">&lt; </span><span class="ident">textarea</span> <span class="ident">cols</span><span class="punct">="</span><span class="string">20</span><span class="punct">"</span> <span class="ident">rows</span><span class="punct">="</span><span class="string">40</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">post_body</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[body]</span><span class="punct">"&gt;</span>
<span class="comment">#{@post.body}</span>
<span class="regex">textarea&gt;</span></pre>
<h3 id="radiobutton">Radio Button</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> radio_button :modelname, :attribute, :tag_value, options %&gt;</span></pre>
<p>creates a radio button.</p>
<p>Example:</p>
<pre><code>
</code></pre>
<pre><span class="ident">radio_button</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">category</span><span class="punct">",</span> <span class="punct">"</span><span class="string">rails</span><span class="punct">"</span>
<span class="ident">radio_button</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">category</span><span class="punct">",</span> <span class="punct">"</span><span class="string">java</span><span class="punct">"</span>
<span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">type</span><span class="punct">="</span><span class="string">radio</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">post_category</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[category]</span><span class="punct">"</span> <span class="ident">value</span><span class="punct">="</span><span class="string">rails</span><span class="punct">"</span>
<span class="ident">checked</span><span class="punct">="</span><span class="string">checked</span><span class="punct">"</span> <span class="punct">/&gt;</span>
<span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">type</span><span class="punct">="</span><span class="string">radio</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">post_category</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[category]</span><span class="punct">"</span> <span class="ident">value</span><span class="punct">="</span><span class="string">java</span><span class="punct">"</span> <span class="punct">/&gt;</span></pre>
<h3 id="checkbox">Check Box</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> check_box :modelname, :attribute, options, on_value, off_value %&gt;</span></pre>
<p>Example:</p>
<pre><code>
</code></pre>
<pre><span class="ident">check_box</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">validated</span><span class="punct">"</span>   <span class="comment"># post.validated? returns 1 or 0</span>
<span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">type</span><span class="punct">="</span><span class="string">checkbox</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">post_validate</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[validated]</span><span class="punct">"</span>
<span class="ident">value</span><span class="punct">="</span><span class="string">1</span><span class="punct">"</span> <span class="ident">checked</span><span class="punct">="</span><span class="string">checked</span><span class="punct">"</span> <span class="punct">/&gt;</span>
<span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[validated]</span><span class="punct">"</span> <span class="ident">type</span><span class="punct">="</span><span class="string">hidden</span><span class="punct">"</span> <span class="ident">value</span><span class="punct">="</span><span class="string">0</span><span class="punct">"</span> <span class="punct">/&gt;</span>

<span class="ident">check_box</span> <span class="punct">"</span><span class="string">puppy</span><span class="punct">",</span> <span class="punct">"</span><span class="string">gooddog</span><span class="punct">",</span> <span class="punct">{},</span> <span class="punct">"</span><span class="string">yes</span><span class="punct">",</span> <span class="punct">"</span><span class="string">no</span><span class="punct">"</span>
<span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">type</span><span class="punct">="</span><span class="string">checkbox</span><span class="punct">"</span> <span class="ident">id</span><span class="punct">="</span><span class="string">puppy_gooddog</span><span class="punct">"</span> <span class="ident">name</span><span class="punct">="</span><span class="string">puppy[gooddog]</span><span class="punct">"</span> <span class="ident">value</span><span class="punct">="</span><span class="string">yes</span><span class="punct">"</span> <span class="punct">/&gt;</span>
<span class="punct">&lt; </span><span class="ident">input</span> <span class="ident">name</span><span class="punct">="</span><span class="string">puppy[gooddog]</span><span class="punct">"</span> <span class="ident">type</span><span class="punct">="</span><span class="string">hidden</span><span class="punct">"</span> <span class="ident">value</span><span class="punct">="</span><span class="string">no</span><span class="punct">"</span> <span class="punct">/&gt;</span></pre>
<h3 id="options">Options</h3>
<p>Create a select tag. Pass an array of choices</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> select :variable, :attribute, choices, options, html_options %&gt;

select  "post",
"person_id",
Person.find_all.collect {|p| [ p.name, p.id ] },
{ :include_blank </span><span class="punct">=&gt;</span> <span class="constant">true</span> <span class="punct">}</span>

<span class="punct">&lt; </span><span class="ident">select</span> <span class="ident">name</span><span class="punct">="</span><span class="string">post[person_id]</span><span class="punct">"&gt;</span>
<span class="punct">&lt; </span><span class="ident">option</span><span class="punct">&gt;</span><span class="regex">option&gt;
David&lt; </span><span class="punct">/</span><span class="ident">option</span><span class="punct">&gt;</span>
<span class="punct">&lt; </span><span class="ident">option</span> <span class="ident">value</span><span class="punct">="</span><span class="string">2</span><span class="punct">"&gt;</span><span class="constant">Sam</span><span class="regex">option&gt;
Tobias&lt; </span><span class="punct">/</span><span class="ident">option</span><span class="punct">&gt;</span>
<span class="regex">select&gt;

&lt; %= collection_select :variable, :attribute, choices, :id, :value %&gt;</span></pre>
<h3 id="datetime">Date Time</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> date_select :variable, :attribute, options %&gt;
&lt; %</span><span class="punct">=</span> <span class="ident">datetime_select</span> <span class="symbol">:variable</span><span class="punct">,</span> <span class="symbol">:attribute</span><span class="punct">,</span> <span class="ident">options</span> <span class="punct">%&gt;</span></pre>
<p>Examples:</p>
<pre><code>
</code></pre>
<pre><span class="ident">date_select</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">written_on</span><span class="punct">"</span>
<span class="ident">date_select</span> <span class="punct">"</span><span class="string">user</span><span class="punct">",</span> <span class="punct">"</span><span class="string">birthday</span><span class="punct">",</span> <span class="symbol">:start_year</span> <span class="punct">=&gt;</span> <span class="number">1910</span>
<span class="ident">date_select</span> <span class="punct">"</span><span class="string">user</span><span class="punct">",</span> <span class="punct">"</span><span class="string">cc_date</span><span class="punct">",</span> <span class="symbol">:start_year</span> <span class="punct">=&gt;</span> <span class="number">2005</span><span class="punct">,</span>
<span class="symbol">:use_month_numbers</span> <span class="punct">=&gt;</span> <span class="constant">true</span><span class="punct">,</span>
<span class="symbol">:discard_day</span> <span class="punct">=&gt;</span> <span class="constant">true</span><span class="punct">,</span>
<span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> rder</span> <span class="punct">=&gt;</span> <span class="punct">[</span><span class="symbol">:year</span><span class="punct">,</span> <span class="symbol">:month</span><span class="punct">]</span>

<span class="ident">datetime_select</span> <span class="punct">"</span><span class="string">post</span><span class="punct">",</span> <span class="punct">"</span><span class="string">written_on</span><span class="punct">"</span></pre>
<h3 id="endformtag">End Form Tag</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> end_form_tag %&gt;</span></pre>
<h2 id="layouts">Layouts</h2>
<p>A layout defines the <em>surroundings</em> of an HTML page. Itâ€™s the place to define common look &amp; feel. Layouts live in <code>app/views/layouts</code></p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; </span><span class="ident">html</span><span class="punct">&gt;</span>
<span class="punct">&lt; </span><span class="ident">head</span><span class="punct">&gt;</span>
<span class="punct">&lt; </span><span class="ident">title</span><span class="punct">&gt;</span><span class="constant">Form</span><span class="punct">:</span> <span class="punct">&lt; %=</span><span class="string"> controller.action_name %&gt;
&lt; %</span><span class="punct">=</span> <span class="ident">stylesheet_link_tag</span> <span class="punct">'</span><span class="string">scaffold</span><span class="punct">'</span> <span class="punct">%&gt;</span><span class="string">
</span><span class="punct">&gt;</span>
<span class="punct">&lt; </span><span class="ident">body</span><span class="punct">&gt;</span>
<span class="punct">&lt; %=</span><span class="string"> yield %&gt;   # the content will show up here

----

class MyController &lt; ApplicationController
layout "standard", :except </span><span class="punct">=&gt;</span> <span class="punct">[</span> <span class="symbol">:rss</span><span class="punct">,</span> <span class="symbol">:atom</span> <span class="punct">]</span>
<span class="punct">...</span>
<span class="keyword">end</span>

<span class="punct">----</span>

<span class="keyword">class </span><span class="class">MyOtherController</span> <span class="punct">&lt; </span> <span class="constant">ApplicationController</span>
<span class="ident">layout</span> <span class="symbol">:compute_layout</span>

<span class="comment"># this method computes the name of the layout to use</span>
<span class="keyword">def </span><span class="method">compute_layout</span>
<span class="keyword">return</span> <span class="punct">"</span><span class="string">admin</span><span class="punct">"</span> <span class="keyword">if</span> <span class="ident">session</span><span class="punct">[</span><span class="symbol">:role</span><span class="punct">]</span> <span class="punct">==</span> <span class="punct">"</span><span class="string">admin</span><span class="punct">"</span>
<span class="punct">"</span><span class="string">standard</span><span class="punct">"</span>
<span class="keyword">end</span>
<span class="punct">...</span>
<span class="keyword">end</span></pre>
<p>Layouts have access to the instance variables of the controller so you can pass values â€œupâ€</p>
<h2 id="partials">Partials</h2>
<p>Partials are building blocks for creating views. They allow re-use of commonly used display blocks. They are stored in files:</p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">product</span><span class="punct">'</span></pre>
<p>loads the partial in  <code>_form.rthml</code> and passed the instance variable <code>@product</code> to it. The partial can access it using <code>@product</code></p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">product</span><span class="punct">',</span> <span class="symbol">:locals</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:product</span> <span class="punct">=&gt;</span> <span class="attribute">@bought</span> <span class="punct">}</span></pre>
<p>loads the same partial but assigns a different instance variable to it.</p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:partial</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">product</span><span class="punct">',</span> <span class="symbol">:collection</span> <span class="punct">=&gt;</span> <span class="attribute">@product_list</span></pre>
<p>renders the partial for each element in <code>@product_list</code> and assigns <code>@product</code> to each element. An iteration counter will automatically be made available to the template with a name of the form <code>partial_name_counter</code> (in the above example: <code>product_counter</code>).</p>
<h2 id="components">Components</h2>
<p>To reuse both controller logic and views, use them as â€œcomponentsâ€</p>
<pre><code>
</code></pre>
<pre><span class="ident">render_component</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">posts</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">last_posts</span><span class="punct">'</span></pre>
<p>That calls <code>last_posts</code> in the PostsController. Use</p>
<pre><code>
</code></pre>
<pre><span class="ident">render</span> <span class="symbol">:layout</span> <span class="punct">=&gt;</span> <span class="constant">false</span><span class="punct">,</span> <span class="punct">...</span></pre>
<p>or</p>
<pre><code>
</code></pre>
<pre><span class="ident">layout</span> <span class="punct">"</span><span class="string">xxx</span><span class="punct">",</span> <span class="symbol">:except</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">last_posts</span><span class="punct">'</span></pre>
<p>to render this action without a layout</p>
<h2 id="functionaltesting">Functional Testing</h2>
<pre><code>
</code></pre>
<pre><span class="ident">rake</span> <span class="ident">test</span><span class="symbol">:functional</span></pre>
<h3 id="requests">Requests</h3>
<pre><code>
</code></pre>
<pre><span class="ident">get</span> <span class="symbol">:action</span> <span class="comment"># a get request of the specificed action</span>
<span class="ident">get</span> <span class="symbol">:action</span><span class="punct">,</span> <span class="punct">{</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="number">1</span> <span class="punct">},</span> <span class="comment"># use {} only if you use session/flash hash</span>
<span class="punct">{</span> <span class="ident">session_hash</span> <span class="punct">},</span> <span class="comment"># optional session variables</span>
<span class="punct">{</span> <span class="ident">flash_hash</span> <span class="punct">}</span>    <span class="comment"># optional messages in the flash</span>

<span class="ident">post</span> <span class="symbol">:action</span><span class="punct">,</span> <span class="punct">{</span> <span class="symbol">:foo</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:value1</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">abc</span><span class="punct">',</span> <span class="symbol">:value2</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">123</span><span class="punct">'</span> <span class="punct">}},</span>
<span class="punct">{</span> <span class="symbol">:user_id</span> <span class="punct">=&gt;</span> <span class="number">17</span> <span class="punct">},</span>
<span class="punct">{</span> <span class="symbol">:message</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">success</span><span class="punct">'</span> <span class="punct">}</span>

<span class="ident">get</span><span class="punct">,</span> <span class="ident">post</span><span class="punct">,</span> <span class="ident">put</span><span class="punct">,</span> <span class="ident">delete</span><span class="punct">,</span> <span class="ident">head</span>

<span class="ident">assert_response</span> <span class="symbol">:success</span>
<span class="comment"># possible parameters are:</span>
<span class="comment">#   :success   </span>
<span class="comment">#   :redirect  </span>
<span class="comment">#   :missing</span>
<span class="comment">#   :error</span></pre>
<h3 id="ajaxrequests">AJAX Requests</h3>
<pre><code>
</code></pre>
<pre><span class="ident">xhr</span> <span class="symbol">:get</span><span class="punct">,</span> <span class="symbol">:action</span>  <span class="comment"># make an "Ajax" Requests to of the specified action</span>
<span class="ident">xhr</span> <span class="symbol">:post</span><span class="punct">,</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ther_action</span><span class="punct">,</span> <span class="punct">{</span><span class="symbol">:foo</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:value1</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">abc</span><span class="punct">',</span> <span class="symbol">:value2</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">123</span><span class="punct">'</span> <span class="punct">}}}</span></pre>
<h3 id="redirects">Redirects</h3>
<pre><code>
</code></pre>
<pre><span class="ident">assert_redirected_to</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> ther_action</span>
<span class="ident">assert_redirected_to</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">foo</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">bar</span><span class="punct">'</span>
<span class="ident">assert_redirected_to</span> <span class="ident">http</span><span class="punct">:/</span><span class="regex"><span class="punct">/</span><span class="ident">www</span><span class="punct">.</span><span class="ident">invisible</span><span class="punct">.</span><span class="ident">ch</span></span></pre>
<h3 id="renderedwithtemplate">Rendered with template</h3>
<pre><code>
</code></pre>
<pre><span class="ident">assert_template</span> <span class="punct">"</span><span class="string">post/index</span><span class="punct">"</span></pre>
<h3 id="variableassignments">Variable assignments</h3>
<pre><code>
</code></pre>
<pre><span class="ident">assert_nil</span> <span class="ident">assigns</span><span class="punct">(</span><span class="symbol">:some_variable</span><span class="punct">)</span>
<span class="ident">assert_not_nil</span> <span class="ident">assigns</span><span class="punct">(</span><span class="symbol">:some_variable</span><span class="punct">)</span>
<span class="ident">assert_equal</span> <span class="number">17</span><span class="punct">,</span> <span class="ident">assigns</span><span class="punct">(</span><span class="symbol">:posts</span><span class="punct">).</span><span class="ident">size</span></pre>
<h3 id="renderingofspecifictags">Rendering of specific tags</h3>
<pre><code>
</code></pre>
<pre><span class="ident">assert_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">body</span><span class="punct">'</span>
<span class="ident">assert_tag</span> <span class="symbol">:content</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Rails Seminar</span><span class="punct">'</span>
<span class="ident">assert_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">div</span><span class="punct">',</span> <span class="symbol">:attributes</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:class</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">index_list</span><span class="punct">'</span> <span class="punct">}</span>
<span class="ident">assert_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">head</span><span class="punct">',</span> <span class="symbol">:parent</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">body</span><span class="punct">'</span> <span class="punct">}</span>
<span class="ident">assert_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">html</span><span class="punct">',</span> <span class="symbol">:child</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">head</span><span class="punct">'</span> <span class="punct">}</span>
<span class="ident">assert_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">body</span><span class="punct">',</span> <span class="symbol">:descendant</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">div</span><span class="punct">'</span> <span class="punct">}</span>
<span class="ident">assert_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">ul</span><span class="punct">',</span>
<span class="symbol">:children</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:count</span> <span class="punct">=&gt;</span> <span class="number">1</span><span class="punct">..</span><span class="number">3</span><span class="punct">,</span>
<span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> nly</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">li</span><span class="punct">'</span> <span class="punct">}</span> <span class="punct">}</span></pre>
<h3 id="assertingthatspecifictagwasnotrendered">Asserting that specific tag was NOT rendered</h3>
<pre><code>
</code></pre>
<pre><span class="ident">assert_no_tag</span> <span class="symbol">:tag</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">div</span><span class="punct">',</span> <span class="symbol">:attributes</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">some_id</span><span class="punct">'</span> <span class="punct">}</span></pre>
<h3 id="assertionsregardingrouting">Assertions regarding routing</h3>
<p>Test that some options generate a specific path:</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_generates</span> <span class="punct">'</span><span class="string">books/edit/2</span><span class="punct">',</span> <span class="punct">{</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">books</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">edit</span><span class="punct">',</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="number">2</span> <span class="punct">}</span></pre>
<p>The test to see, if a route is recognized is, user assert_recognizes</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_recognizes</span> <span class="punct">{</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">projects</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">list</span><span class="punct">'</span> <span class="punct">},</span> <span class="punct">'</span><span class="string">projects/list</span><span class="punct">'</span></pre>
<p>To test both assertion in one go, use</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_routing</span> <span class="punct">'</span><span class="string">users/show/2</span><span class="punct">',</span> <span class="punct">{</span> <span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">users</span><span class="punct">',</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">show</span><span class="punct">',</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="number">2</span> <span class="punct">}</span></pre>
<h3 id="testinghtmlgeneration">Testing HTML generation</h3>
<p>Use this to test helper functions that generate HTML snippets. The two assertions are looking for a match on the DOM level (that means, that attributes could appear in any order without the test breaking)</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_dom_equal</span> <span class="punct">"</span><span class="string"><a class="escape">\"</a></span>http://www.example.com<span class="escape">\"</span>&gt;Example<span class="punct">",</span> <span class="ident">link_to</span> <span class="punct">"</span><span class="string">Example</span><span class="punct">",</span> <span class="punct">"</span><span class="string">http://www.example.com</span><span class="punct">"</span></pre>
<p>and itâ€™s sibling:</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_dom_not_equal</span></pre>
<h3 id="testingforvalidrecord">Testing for valid record</h3>
<p>Asserts that the record is valid (i.e. hasnâ€™t any error messages when saving)</p>
<pre><code>
</code></pre>
<pre><span class="ident">assert_valid</span> <span class="attribute">@book</span></pre>
<h2 id="ajax">AJAX</h2>
<p>Be sure to include the javascript libraries in the layout</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> javascript_include_tag :defaults %&gt;</span></pre>
<h3 id="linkingtoremoteaction">Linking to remote action</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> link_to_remote "link", :update </span><span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">some_div</span><span class="punct">',</span>
<span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">show</span><span class="punct">',</span> <span class="symbol">:id</span> <span class="punct">=&gt;</span> <span class="ident">post</span><span class="punct">.</span><span class="ident">id</span> <span class="punct">}</span> <span class="punct">%&gt;</span><span class="string">

&lt; %= link_to_remote "link", :url =</span><span class="punct">&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">create</span><span class="punct">'</span> <span class="punct">},</span>
<span class="symbol">:update</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:success</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">good_div</span><span class="punct">',</span>
<span class="symbol">:failure</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">error_div</span><span class="punct">'</span> <span class="punct">},</span>
<span class="symbol">:loading</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">Element.show(</span><span class="punct">'</span><span class="ident">spinner</span><span class="punct">'</span><span class="string">),
:complete =&gt; </span><span class="punct">'</span><span class="constant">Element</span><span class="punct">.</span><span class="ident">hide</span><span class="punct">('</span><span class="string">spinner</span><span class="punct">')</span>  <span class="punct">%&gt;</span></pre>
<h3 id="callbacks">Callbacks</h3>
<pre><code>
</code></pre>
<pre><span class="symbol">:loading</span>        <span class="constant">Called</span> <span class="keyword">when</span> <span class="ident">the</span> <span class="ident">remote</span> <span class="ident">document</span> <span class="ident">is</span> <span class="ident">being</span> <span class="ident">loaded</span> <span class="ident">with</span> <span class="ident">data</span>
<span class="ident">by</span> <span class="ident">the</span> <span class="ident">browser</span><span class="punct">.</span>
<span class="symbol">:loaded</span>         <span class="ident">Called</span> <span class="ident">when</span> <span class="ident">the</span> <span class="ident">browser</span> <span class="ident">has</span> <span class="ident">finished</span> <span class="ident">loading</span> <span class="ident">the</span> <span class="ident">remote</span> <span class="ident">document</span><span class="punct">.</span>
<span class="symbol">:interactive</span>    <span class="ident">Called</span> <span class="ident">when</span> <span class="ident">the</span> <span class="ident">user</span> <span class="ident">can</span> <span class="ident">interact</span> <span class="ident">with</span> <span class="ident">the</span> <span class="ident">remote</span> <span class="ident">document</span><span class="punct">,</span>
<span class="ident">even</span> <span class="ident">though</span> <span class="ident">it</span> <span class="ident">has</span> <span class="keyword">not</span> <span class="ident">finished</span> <span class="ident">loading</span><span class="punct">.</span>
<span class="symbol">:success</span>        <span class="ident">Called</span> <span class="ident">when</span> <span class="ident">the</span> <span class="constant">XMLHttpRequest</span> <span class="ident">is</span> <span class="ident">completed</span><span class="punct">,</span> <span class="keyword">and</span> <span class="ident">the</span> <span class="constant">HTTP</span>
<span class="ident">status</span> <span class="ident">code</span> <span class="ident">is</span> <span class="keyword">in</span> <span class="ident">the</span> <span class="number">2</span><span class="constant">XX</span> <span class="ident">range</span><span class="punct">.</span>
<span class="symbol">:failure</span>        <span class="ident">Called</span> <span class="ident">when</span> <span class="ident">the</span> <span class="constant">XMLHttpRequest</span> <span class="ident">is</span> <span class="ident">completed</span><span class="punct">,</span> <span class="keyword">and</span> <span class="ident">the</span> <span class="constant">HTTP</span>
<span class="ident">status</span> <span class="ident">code</span> <span class="ident">is</span> <span class="keyword">not</span> <span class="keyword">in</span> <span class="ident">the</span> <span class="number">2</span><span class="constant">XX</span> <span class="ident">range</span><span class="punct">.</span>
<span class="symbol">:complete</span>       <span class="ident">Called</span> <span class="ident">when</span> <span class="ident">the</span> <span class="constant">XMLHttpRequest</span> <span class="ident">is</span> <span class="ident">complete</span> <span class="punct">(</span><span class="ident">fires</span> <span class="ident">after</span>
<span class="ident">success</span><span class="punct">/</span><span class="ident">failure</span> <span class="keyword">if</span> <span class="ident">they</span> <span class="ident">are</span> <span class="ident">present</span><span class="punct">).</span></pre>
<p>You can also specifiy reactions to return codes directly:</p>
<pre><code>
</code></pre>
<pre><span class="ident">link_to_remote</span> <span class="ident">word</span><span class="punct">,</span>
<span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">action</span><span class="punct">"</span> <span class="punct">},</span>
<span class="number">404</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">alert('Not found...? Wrong URL...?')</span><span class="punct">",</span>
<span class="symbol">:failure</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">alert('HTTP Error ' + request.status + '!')</span><span class="punct">"</span></pre>
<h3 id="ajaxforms">AJAX Forms</h3>
<p>Create a form that will submit via an XMLHttpRequest instead of a POST request. The parameters are passed exactly the same way (so the controller can use the <code>params</code> method to access the parameters). Fallback for non JavaScript enabled browsers can be specified by using the :action methods in the :html option.</p>
<pre><code>
</code></pre>
<pre><span class="ident">form_remote_tag</span> <span class="symbol">:html</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="ident">url_for</span><span class="punct">(</span><span class="symbol">:controller</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">controller</span><span class="punct">',</span>
<span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">action</span><span class="punct">'),</span>
<span class="symbol">:method</span> <span class="punct">=&gt;</span> <span class="symbol">:post</span> <span class="punct">}</span></pre>
<h3 id="autocompletingtextfield">Autocompleting textfield</h3>
<p>In View:</p>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> text_field_with_auto_complete :model, :attribute %&gt;</span></pre>
<p>In Controller:</p>
<pre><code>
</code></pre>
<pre><span class="ident">auto_complete_for</span> <span class="symbol">:model</span><span class="punct">,</span> <span class="symbol">:attribute</span></pre>
<h3 id="observefield">Observe Field</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; </span><span class="ident">label</span> <span class="keyword">for</span><span class="punct">="</span><span class="string">search</span><span class="punct">"&gt;</span><span class="constant">Search</span> <span class="ident">term</span><span class="punct">:</span><span class="regex">label&gt;
&lt; %= text_field_tag :search %&gt;
&lt; %= observe_field(:search,
:frequency =&gt; 0.5,
:update =&gt; :results,
:url =&gt; { :action =&gt; :search }) %&gt;
<div id="results">&lt; <span class="punct">/</span><span class="ident">div</span><span class="punct">&gt;</span></div>

</span></pre>
<p>Optionally specify:</p>
<pre><code>
</code></pre>
<pre><span class="symbol"> <img src='http://blog.fabiolagana.net/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> n</span> <span class="punct">=&gt;</span> <span class="symbol">:blur</span>    <span class="comment"># trigger for event (default :changed or :clicked) </span>
<span class="symbol">:with</span> <span class="punct">=&gt;</span> <span class="punct">...</span>    <span class="comment"># a JavaScript expression to specify what value is sent</span>
<span class="comment"># defaults to "value"</span>
<span class="symbol">:with</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">bla</span><span class="punct">'</span>  <span class="comment"># "'bla' = value"</span>
<span class="symbol">:with</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">a=b</span><span class="punct">'</span>  <span class="comment"># "a=b"</span></pre>
<h3 id="observeform">Observe Form</h3>
<p>Same semantics as <code>observe_field</code></p>
<h3 id="periodicallycallremote">Periodically call Remote</h3>
<pre><code>
</code></pre>
<pre><span class="punct">&lt; %=</span><span class="string"> periodically_call_remote(:update </span><span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">process-list</span><span class="punct">',</span>
<span class="symbol">:url</span> <span class="punct">=&gt;</span> <span class="punct">{</span> <span class="symbol">:action</span> <span class="punct">=&gt;</span> <span class="symbol">:ps</span> <span class="punct">},</span>
<span class="symbol">:frequency</span> <span class="punct">=&gt;</span> <span class="number">2</span> <span class="punct">)</span> <span class="punct">%&gt;</span></pre>
<h1 id="configuringyourapplication">Configuring your application</h1>
<p>A lot of things can be configured in the <code>config/environment.rb</code> file. This list is not exhaustive:</p>
<h2 id="sessionconfiguration">Session configuration</h2>
<pre><code>
</code></pre>
<pre><span class="ident">config</span><span class="punct">.</span><span class="ident">action_controller</span><span class="punct">.</span><span class="ident">session_store</span> <span class="punct">=</span> <span class="symbol">:active_record_store</span>
<span class="comment"># one of :active_record_store, :drb_store, </span>
<span class="comment"># :mem_cache_store, or :memory_store or your own class</span>

<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:session_key</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">my_app</span><span class="punct">'</span>
<span class="comment"># use an application specific session_key</span>
<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:session_id</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">12345</span><span class="punct">'</span>
<span class="comment"># use this session_id. Will be created if not specified</span>
<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:session_expires</span><span class="punct">]</span> <span class="punct">=</span> <span class="number">3</span><span class="punct">.</span><span class="ident">minute</span><span class="punct">.</span><span class="ident">from_now</span>
<span class="comment"># how long before a session expires?</span>
<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:new_session</span><span class="punct">]</span> <span class="punct">=</span> <span class="constant">true</span>
<span class="comment"># force the creation of a new session</span>
<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:session_secure</span><span class="punct">]</span> <span class="punct">=</span> <span class="constant">true</span>
<span class="comment"># only use sessions over HTTPS</span>
<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:session_domain</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">invisible.ch</span><span class="punct">'</span>
<span class="comment"># Specify which domain this session is valid for (default: hostname of server)</span>
<span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">session_options</span><span class="punct">[</span><span class="symbol">:session_path</span><span class="punct">]</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">/my_app</span><span class="punct">'</span>
<span class="comment"># the path for which this session applies.  Defaults to the </span>
<span class="comment"># directory of the CGI script</span></pre>
<h2 id="cachingconfiguration">Caching configuration</h2>
<pre><code>
</code></pre>
<pre><span class="constant">ActionController</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">fragment_cache_store</span> <span class="punct">=</span> <span class="symbol">:file_store</span><span class="punct">,</span> <span class="punct">"</span><span class="string">/path/to/cache/directory</span><span class="punct">"</span></pre>
<h1 id="actionmailer">ActionMailer</h1>
<h2 id="generatemailer">Generate Mailer</h2>
<p>Use a generator to create the mailer:</p>
<pre><code>
</code></pre>
<pre><span class="global">$ </span><span class="ident">ruby</span> <span class="ident">script</span><span class="punct">/</span><span class="ident">generate</span> <span class="ident">mailer</span> <span class="constant">MyMailer</span> <span class="ident">signup_mail</span></pre>
<p>This creates <code>app/models/my_mailer.rb</code>, <code>app/view/my_mail/signup_mail.rhtml</code> and test files.</p>
<h2 id="constructionofmail">Construction of Mail</h2>
<h3 id="mailermodel">Mailer â€œModelâ€</h3>
<p>Define the mailer method:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">class </span><span class="class">MyMailer</span> <span class="punct">&lt; </span> <span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span>
<span class="keyword">def </span><span class="method">signup_mail</span><span class="punct">(</span><span class="ident">send_to</span><span class="punct">,</span> <span class="ident">name</span><span class="punct">,</span> <span class="ident">title</span><span class="punct">,</span> <span class="ident">my_body</span><span class="punct">,</span> <span class="ident">sent_at</span> <span class="punct">=</span> <span class="constant">Time</span><span class="punct">.</span><span class="ident">now</span><span class="punct">)</span>
<span class="ident">recipients</span>  <span class="ident">send_to</span>
<span class="ident">subject</span>     <span class="punct">"</span><span class="string">Signup Mail for: </span><span class="expr">#{name}</span><span class="punct">"</span>
<span class="ident">from</span> <span class="punct">=</span> <span class="punct">'</span><span class="string">someonone@example.com</span><span class="punct">'</span>

<span class="attribute">@title</span>      <span class="punct">=</span> <span class="ident">title</span>
<span class="ident">body</span>       <span class="punct">=</span> <span class="ident">body</span>
<span class="attribute">@recipients</span> <span class="punct">=</span> <span class="ident">recipient</span>
<span class="attribute">@from</span>       <span class="punct">=</span> <span class="punct">'</span><span class="string">someone@example.com</span><span class="punct">'</span>
<span class="attribute">@sent_on</span>    <span class="punct">=</span> <span class="ident">sent_at</span>
<span class="attribute">@headers</span>    <span class="punct">=</span> <span class="punct">{}</span>
<span class="keyword">end</span>
<span class="keyword">end</span></pre>
<h3 id="mailerview">Mailer â€œViewâ€</h3>
<p>Find them in <code>app/views/my_mail/*</code>. Just like RHTML templates, but:</p>
<pre><code>
</code></pre>
<pre><span class="ident">signup_mail</span><span class="punct">.</span><span class="ident">text</span><span class="punct">.</span><span class="ident">plain</span><span class="punct">.</span><span class="ident">rhtml</span>
<span class="ident">signup_mail</span><span class="punct">.</span><span class="ident">text</span><span class="punct">.</span><span class="ident">html</span><span class="punct">.</span><span class="ident">rhtml</span>
<span class="punct">...</span></pre>
<p>will specify the Mime type of the response sent.</p>
<h2 id="createanddeliver">Create and Deliver</h2>
<p>To create or send a mail from, just do:</p>
<pre><code>
</code></pre>
<pre><span class="ident">mail</span> <span class="punct">=</span> <span class="constant">MyMailer</span><span class="punct">.</span><span class="ident">create_signup_mail</span><span class="punct">("</span><span class="string">joe@doe.com</span><span class="punct">",</span> <span class="punct">"</span><span class="string">Joe</span><span class="punct">",</span> <span class="punct">"</span><span class="string">your new account</span><span class="punct">",</span> <span class="punct">"</span><span class="string">some more stuff</span><span class="punct">")</span>
<span class="constant">MyMailer</span><span class="punct">.</span><span class="ident">deliver</span><span class="punct">(</span><span class="ident">mail</span><span class="punct">)</span></pre>
<p>or</p>
<pre><code>
</code></pre>
<pre><span class="constant">MyMailer</span><span class="punct">.</span><span class="ident">deliver_signup_mail</span><span class="punct">("</span><span class="string">joe@doe.com</span><span class="punct">",</span> <span class="punct">"</span><span class="string">Joe</span><span class="punct">",</span> <span class="punct">"</span><span class="string">your new account</span><span class="punct">",</span> <span class="punct">"</span><span class="string">some more stuff</span><span class="punct">")</span></pre>
<p>which will create a mail object and deliver it or create and deliver the mail in one step, respectively.</p>
<h2 id="testing">Testing</h2>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">test_signup_mail</span>
<span class="constant">MyMailer</span><span class="punct">.</span><span class="ident">deliver_signup_mail</span><span class="punct">("</span><span class="string">joe@doe.com</span><span class="punct">",</span> <span class="punct">"</span><span class="string">Joe</span><span class="punct">",</span> <span class="punct">"</span><span class="string">your new account</span><span class="punct">",</span>
<span class="punct">"</span><span class="string">some_more_stuff</span><span class="punct">",</span> <span class="attribute">@expected</span><span class="punct">.</span><span class="ident">date</span><span class="punct">)</span>
<span class="ident">assert</span> <span class="punct">!</span><span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">deliveries</span><span class="punct">.</span><span class="ident">empty?</span>

<span class="ident">sent</span> <span class="punct">=</span> <span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">deliveries</span><span class="punct">.</span><span class="ident">first</span>
<span class="ident">assert_equal</span> <span class="punct">'</span><span class="string">joe@doe.com</span><span class="punct">',</span> <span class="ident">sent</span><span class="punct">.</span><span class="ident">to</span><span class="punct">.</span><span class="ident">first</span>
<span class="ident">assert_equal</span> <span class="punct">"</span><span class="string">your new account</span><span class="punct">",</span> <span class="ident">sent</span><span class="punct">.</span><span class="ident">subject</span>
<span class="ident">assert_equal</span> <span class="punct">"</span><span class="string">info@my_corp.com</span><span class="punct">",</span> <span class="ident">sent</span><span class="punct">.</span><span class="ident">from</span><span class="punct">.</span><span class="ident">first</span>
<span class="ident">assert</span> <span class="ident">sent</span><span class="punct">.</span><span class="ident">body</span> <span class="punct">=~</span> <span class="punct">/</span><span class="regex">^some more stuff</span><span class="punct">/</span>
<span class="keyword">end</span></pre>
<h2 id="configure">Configure</h2>
<pre><code>
</code></pre>
<pre><span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">delivery_method</span> <span class="punct">=</span> <span class="symbol">:smtp</span>
<span class="comment"># alternatively: :sendmail, :test</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">server_settings</span> <span class="punct">=</span> <span class="punct">{</span>
<span class="symbol">:address</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">mail.mydomain.com</span><span class="punct">",</span>
<span class="symbol">:port</span> <span class="punct">=&gt;</span> <span class="number">25</span><span class="punct">,</span>
<span class="symbol">:domain</span> <span class="punct">=&gt;</span> <span class="punct">'</span><span class="string">mydomain.com</span><span class="punct">',</span>
<span class="symbol">:user_name</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">username</span><span class="punct">",</span>
<span class="symbol">:password</span> <span class="punct">=&gt;</span> <span class="punct">"</span><span class="string">password</span><span class="punct">",</span>
<span class="symbol">:authentication</span> <span class="punct">=&gt;</span> <span class="symbol">:login</span>  <span class="comment"># possible values :plain, :login, :cram_md5</span>
<span class="punct">}</span>

<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">template_root</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">mailer/templates</span><span class="punct">"</span>
<span class="comment"># mailer will look for rhtml templates in that path</span>
<span class="comment"># example: "mailer/templates/my_mailer/signup_mail.rhtml"</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">perform_deliveries</span> <span class="punct">=</span> <span class="constant">true</span> <span class="comment"># the "deliver_*" methods are available</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">raise_delivery_errors</span> <span class="punct">=</span> <span class="constant">true</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">default_charset</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">utf-8</span><span class="punct">"</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">default_content_type</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">text/html</span><span class="punct">"</span> <span class="comment"># default: "text/plain"</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">default_mime_version</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">1.0</span><span class="punct">"</span>
<span class="constant">ActionMailer</span><span class="punct">::</span><span class="constant">Base</span><span class="punct">.</span><span class="ident">default_implicit_parts_order</span> <span class="punct">=</span> <span class="punct">[</span> <span class="punct">"</span><span class="string">text/html</span><span class="punct">",</span> <span class="punct">"</span><span class="string">text/plain</span><span class="punct">"]</span></pre>
<p>Some of the settings can be overridden in the mailer method body:</p>
<pre><code>
</code></pre>
<pre><span class="keyword">def </span><span class="method">my_mail</span>
<span class="attribute">@charset</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">utf-8</span><span class="punct">"</span>
<span class="attribute">@content_type</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">text/html</span><span class="punct">"</span>
<span class="attribute">@mime_version</span> <span class="punct">=</span> <span class="punct">"</span><span class="string">1.0</span><span class="punct">"</span>
<span class="attribute">@implicit_parts_order</span> <span class="punct">=</span> <span class="punct">[</span> <span class="punct">"</span><span class="string">text/plain</span><span class="punct">",</span> <span class="punct">"</span><span class="string">text/html</span><span class="punct">"]</span>
<span class="keyword">end</span></pre>
<h1 id="appendix">Appendix</h1>
<h2 id="changelog">Changelog</h2>
<p><a href="http://blog.invisible.ch/files/changelog.html" onclick="pageTracker._trackPageview('/outgoing/blog.invisible.ch/files/changelog.html?referer=');">Changelog</a></p>
<h2 id="sources">Sources</h2>
<ul>
<li><em>Agile Web Development with Rails</em></li>
<li>The Rails-Users mailing list</li>
<li>The Rails Source code</li>
</ul>
<h2 id="license">License</h2>
<p>Part of the course materials for the Ruby On Rails Workshop by InVisible GmbH.</p>
<p>InVisible GmbH<br />
Schweighofstrasse 312<br />
8055 ZÃ¼rich<br />
+41 44 401 09 30</p>
<p>http://www.invisible.ch</p>
<p>mailto:info@invisible.ch<br />
<!--Creative Commons License--><a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/" onclick="pageTracker._trackPageview('/outgoing/creativecommons.org/licenses/by-sa/2.5/?referer=');"><img src="http://creativecommons.org/images/public/somerights20.png" border="0" alt="Creative Commons License" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabiolagana.net/invisible-ruby-on-rails-reference-112/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
