<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Zack Hubert]]></title>
  <link href="http://zhubert.github.io/atom.xml" rel="self"/>
  <link href="http://zhubert.github.io/"/>
  <updated>2013-05-21T17:45:55-07:00</updated>
  <id>http://zhubert.github.io/</id>
  <author>
    <name><![CDATA[Zack Hubert]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: Testing and Stringy Booleans]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/20/rails-source-activesupport-part-8/"/>
    <updated>2013-05-20T19:16:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/20/rails-source-activesupport-part-8</id>
    <content type="html"><![CDATA[<p>One of the things that I really like about the Ruby community is the serious focus on testing.  When you&rsquo;ve really got your testing dialed in, there&rsquo;s a tremendous sense of peace knowing that you can refactor to your heart&rsquo;s content&hellip;and add new functionality of course&hellip;that too.</p>

<h3>A Testing Artifact</h3>

<p>So as I was finishing up my read through of ActiveSupport, I came across this bit of code in the testing subdirectory:</p>

<figure class='code'><figcaption><span>active_support/testing/declarative.rb</span><a href='https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/testing/declarative.rb'>link</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">ActiveSupport</span>
</span><span class='line'>  <span class="k">module</span> <span class="nn">Testing</span>
</span><span class='line'>    <span class="k">module</span> <span class="nn">Declarative</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">extended</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span> <span class="c1">#:nodoc:</span>
</span><span class='line'>        <span class="n">klass</span><span class="o">.</span><span class="n">class_eval</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>          <span class="k">unless</span> <span class="nb">method_defined?</span><span class="p">(</span><span class="ss">:describe</span><span class="p">)</span>
</span><span class='line'>            <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">describe</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span class='line'>              <span class="nb">class_eval</span> <span class="o">&lt;&lt;-</span><span class="no">RUBY_EVAL</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">,</span> <span class="bp">__LINE__</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'><span class="sh">                def self.name</span>
</span><span class='line'><span class="sh">                  &quot;#{text}&quot;</span>
</span><span class='line'><span class="sh">                end</span>
</span><span class='line'><span class="no">              RUBY_EVAL</span>
</span><span class='line'>            <span class="k">end</span>
</span><span class='line'>          <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>We&rsquo;ve seen <code>class_eval</code> before, but we haven&rsquo;t come across the <code>extended</code> lifecycle hook.  Basically, it gets called by Ruby when you extend a class with this module, so you can use it to bootstrap whatever functionality you want to shove into your class.  In this case, we define a class level method called <code>describe</code>.  It appears that that method then overrides the <code>name</code> class method with whatever you pass in as an argument to <code>describe</code>.</p>

<p>Just to confirm this, let&rsquo;s petri dish this in the console.  First I write up a barebones module that has this functionality:</p>

<figure class='code'><figcaption><span>Thing</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Thing</span>
</span><span class='line'>  <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">extended</span><span class="p">(</span><span class="n">klass</span><span class="p">)</span> <span class="c1">#:nodoc:</span>
</span><span class='line'>    <span class="n">klass</span><span class="o">.</span><span class="n">class_eval</span> <span class="k">do</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">unless</span> <span class="nb">method_defined?</span><span class="p">(</span><span class="ss">:describe</span><span class="p">)</span>
</span><span class='line'>        <span class="k">def</span> <span class="nc">self</span><span class="o">.</span><span class="nf">describe</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>
</span><span class='line'>          <span class="nb">class_eval</span> <span class="o">&lt;&lt;-</span><span class="no">RUBY_EVAL</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">,</span> <span class="bp">__LINE__</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'><span class="sh">            def self.name</span>
</span><span class='line'><span class="sh">              &quot;#{text}&quot;</span>
</span><span class='line'><span class="sh">            end</span>
</span><span class='line'><span class="no">          RUBY_EVAL</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And make two classes, one that extends Thing and the other that doesn&rsquo;t:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Foo</span><span class="p">;</span> <span class="kp">extend</span> <span class="no">Thing</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'><span class="k">class</span> <span class="nc">Bar</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Foo</span><span class="o">.</span><span class="n">methods</span> <span class="o">-</span> <span class="no">Bar</span><span class="o">.</span><span class="n">methods</span>
</span><span class='line'><span class="c1"># =&gt; [:describe]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Neat, extending Foo with Thing gave me a new method&hellip;but does that method do what we were guessing?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Foo</span>
</span><span class='line'>  <span class="kp">extend</span> <span class="no">Thing</span>
</span><span class='line'>  <span class="n">describe</span> <span class="s2">&quot;this is a thing&quot;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Foo</span><span class="o">.</span><span class="n">name</span>
</span><span class='line'><span class="c1"># =&gt; &quot;this is a thing&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="no">Bar</span><span class="o">.</span><span class="n">name</span>
</span><span class='line'><span class="c1"># =&gt; &quot;Bar&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Yep, it does.  Well that&rsquo;s weird.  Digging around in the <a href="https://github.com/rails/rails/commits/master/activesupport/lib/active_support/testing/declarative.rb">history</a> of this file, it looks like this is just an artifact of shifting to minitest (which is very cool by the way).  This blockless <code>describe</code> seems to be a relic of the past, removed from Rails own tests as well.  Still fun to try and figure it out.</p>

<h3>Stringy Booleans</h3>

<p>I really enjoy all the quality of life improvements that are in ActiveSupport.  This one is relatively minor, but I like the implementation and the functionality, so here you go&hellip;</p>

<p>You know how you can check what Rails environment you are currently in via the method:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Rails</span><span class="o">.</span><span class="n">env</span><span class="o">.</span><span class="n">production?</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s actually implemented via a <code>StringInquirer</code>.  Let&rsquo;s say you have a string you want to turn into a boolean looking method, you can tack <code>.inquiry</code> onto it and voila:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">env</span> <span class="o">=</span> <span class="s1">&#39;production&#39;</span><span class="o">.</span><span class="n">inquiry</span>
</span><span class='line'><span class="n">env</span><span class="o">.</span><span class="n">production?</span>
</span><span class='line'><span class="c1"># =&gt; true</span>
</span></code></pre></td></tr></table></div></figure>


<p>Awesome, certainly handy.  What&rsquo;s behind this cleverness?</p>

<figure class='code'><figcaption><span>active_support/string_inquirer.rb</span><a href='https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/string_inquirer.rb'>link</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">ActiveSupport</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">StringInquirer</span> <span class="o">&lt;</span> <span class="nb">String</span>
</span><span class='line'>    <span class="kp">private</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">respond_to_missing?</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="n">include_private</span> <span class="o">=</span> <span class="kp">false</span><span class="p">)</span>
</span><span class='line'>        <span class="n">method_name</span><span class="o">[-</span><span class="mi">1</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;?&#39;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">method_name</span><span class="o">[-</span><span class="mi">1</span><span class="o">]</span> <span class="o">==</span> <span class="s1">&#39;?&#39;</span>
</span><span class='line'>          <span class="nb">self</span> <span class="o">==</span> <span class="n">method_name</span><span class="o">[</span><span class="mi">0</span><span class="o">.</span><span class="n">.</span><span class="o">-</span><span class="mi">2</span><span class="o">]</span>
</span><span class='line'>        <span class="k">else</span>
</span><span class='line'>          <span class="k">super</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>method_missing</code> is called, of course, when we attempt to tell our object to do something that it doesn&rsquo;t know how to do.  In this case, the  <code>StringInquirer</code> checks to see if we are calling a predicate method, and if so, does the comparison for us.</p>

<p>The other bit, the <code>respond_to_missing?</code> is just telling our object that if the requested method ends in a &lsquo;?&rsquo; then respond <code>true</code> to a <code>respond_to?</code> request.  Polite.</p>

<h3>ActiveSupport Done!</h3>

<p>Reading through every line of ActiveSupport has been a lot of fun.  I&rsquo;ve also realized that saturating your mind with good Ruby has the side effect of changing the Ruby you write.  I end up thinking about &ldquo;how they did it in Rails&rdquo; and that benefits my own code.</p>

<p>So where are we at?  Here&rsquo;s lines of code (first is code only, second includes tests):</p>

<ul>
<li>actionmailer: 1119/2975</li>
<li>actionpack: 30854/83422</li>
<li>activemodel: 4481/9701</li>
<li>activerecord: 30318/76848</li>
<li>activesupport: 15785/36089</li>
</ul>


<p>So I guess that means I&rsquo;m 19% of the way through.  Awesome!</p>

<p>I&rsquo;m not sure what subsystem will be next, we&rsquo;ll have to see.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: Self Deprecation and Deprecations]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/18/rails-source-activesupport-part-7/"/>
    <updated>2013-05-18T13:35:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/18/rails-source-activesupport-part-7</id>
    <content type="html"><![CDATA[<p>As I write today&rsquo;s journal, I am struck with how I&rsquo;m not the ideal tour guide of the Rails source.  Having never contributed to the code and coming at it with fresh eyes, I&rsquo;m bound to get things wrong in my notes here.  Hopefully when I do, you fabulous readers out there can provide some corrections in the comments section which I can fold back into the body of the post.</p>

<p>Ok, back to the source!</p>

<h3>Deprecations</h3>

<p>I know you have seen the output of this code before&hellip;you&rsquo;re booting your app when all of the sudden you see something like:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>DEPRECATION WARNING: ActiveSupport::BufferedLogger is deprecated!  Use ActiveSupport::Logger instead.</span></code></pre></td></tr></table></div></figure>


<p>This helpful (though generally frustrating) warning message is emitted by some pretty cool code, code that uses a technique we haven&rsquo;t seen yet in this series.  Let&rsquo;s take a look.</p>

<!-- more -->




<figure class='code'><figcaption><span>active_support/deprecation/behaviors.rb</span><a href='https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/deprecation/behaviors.rb'>link</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">ActiveSupport</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Deprecation</span>
</span><span class='line'>    <span class="no">DEFAULT_BEHAVIORS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>      <span class="ss">:stderr</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>        <span class="vg">$stderr</span><span class="o">.</span><span class="n">puts</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
</span><span class='line'>        <span class="vg">$stderr</span><span class="o">.</span><span class="n">puts</span> <span class="n">callstack</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">  &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">debug</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="ss">:log</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>        <span class="n">logger</span> <span class="o">=</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">defined?</span><span class="p">(</span><span class="no">Rails</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="no">Rails</span><span class="o">.</span><span class="n">logger</span>
</span><span class='line'>              <span class="no">Rails</span><span class="o">.</span><span class="n">logger</span>
</span><span class='line'>            <span class="k">else</span>
</span><span class='line'>              <span class="nb">require</span> <span class="s1">&#39;active_support/logger&#39;</span>
</span><span class='line'>              <span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Logger</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="vg">$stderr</span><span class="p">)</span>
</span><span class='line'>            <span class="k">end</span>
</span><span class='line'>        <span class="n">logger</span><span class="o">.</span><span class="n">warn</span> <span class="n">message</span>
</span><span class='line'>        <span class="n">logger</span><span class="o">.</span><span class="n">debug</span> <span class="n">callstack</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">  &quot;</span><span class="p">)</span> <span class="k">if</span> <span class="n">debug</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="ss">:notify</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>        <span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Notifications</span><span class="o">.</span><span class="n">instrument</span><span class="p">(</span><span class="s2">&quot;deprecation.rails&quot;</span><span class="p">,</span>
</span><span class='line'>                                                <span class="ss">:message</span> <span class="o">=&gt;</span> <span class="n">message</span><span class="p">,</span> <span class="ss">:callstack</span> <span class="o">=&gt;</span> <span class="n">callstack</span><span class="p">)</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="ss">:silence</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span> <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">module</span> <span class="nn">Behavior</span>
</span><span class='line'>      <span class="kp">attr_accessor</span> <span class="ss">:debug</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">behavior</span>
</span><span class='line'>        <span class="vi">@behavior</span> <span class="o">||=</span> <span class="o">[</span><span class="no">DEFAULT_BEHAVIORS</span><span class="o">[</span><span class="ss">:stderr</span><span class="o">]]</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">def</span> <span class="nf">behavior</span><span class="o">=</span><span class="p">(</span><span class="n">behavior</span><span class="p">)</span>
</span><span class='line'>        <span class="vi">@behavior</span> <span class="o">=</span> <span class="nb">Array</span><span class="p">(</span><span class="n">behavior</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">b</span><span class="o">|</span> <span class="no">DEFAULT_BEHAVIORS</span><span class="o">[</span><span class="n">b</span><span class="o">]</span> <span class="o">||</span> <span class="n">b</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>To simplify to the part I&rsquo;m interested in (though the <code>$stderr</code> global variable is interesting too):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">DEFAULT_BEHAVIORS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="ss">:stderr</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>    <span class="c1"># stuff</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="ss">:log</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>    <span class="c1"># stuff</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="ss">:notify</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>    <span class="c1"># stuff</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  <span class="ss">:silence</span> <span class="o">=&gt;</span> <span class="no">Proc</span><span class="o">.</span><span class="n">new</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span> <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>I believe this is a use of the <a href="http://en.wikipedia.org/wiki/Strategy_pattern">Strategy Pattern</a> for swapping out the behaviour of the deprecation warnings at runtime, though I&rsquo;m certainly not an expert at Patterns.  It is implemented via a constant hash where the values are Procs.</p>

<p>As a neat bonus, the assignment operator is pretty clever, enabling single strategies, multiple strategies, a custom handler, or an inline Proc:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">def</span> <span class="nf">behavior</span><span class="o">=</span><span class="p">(</span><span class="n">behavior</span><span class="p">)</span>
</span><span class='line'>  <span class="vi">@behavior</span> <span class="o">=</span> <span class="nb">Array</span><span class="p">(</span><span class="n">behavior</span><span class="p">)</span><span class="o">.</span><span class="n">map</span> <span class="p">{</span> <span class="o">|</span><span class="n">b</span><span class="o">|</span> <span class="no">DEFAULT_BEHAVIORS</span><span class="o">[</span><span class="n">b</span><span class="o">]</span> <span class="o">||</span> <span class="n">b</span> <span class="p">}</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So you can call it in any of the following ways:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Deprecation</span><span class="o">.</span><span class="n">behavior</span> <span class="o">=</span> <span class="ss">:stderr</span>
</span><span class='line'><span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Deprecation</span><span class="o">.</span><span class="n">behavior</span> <span class="o">=</span> <span class="o">[</span><span class="ss">:stderr</span><span class="p">,</span> <span class="ss">:log</span><span class="o">]</span>
</span><span class='line'><span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Deprecation</span><span class="o">.</span><span class="n">behavior</span> <span class="o">=</span> <span class="no">MyCustomHandler</span>
</span><span class='line'><span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Deprecation</span><span class="o">.</span><span class="n">behavior</span> <span class="o">=</span> <span class="nb">proc</span> <span class="p">{</span> <span class="o">|</span><span class="n">message</span><span class="p">,</span> <span class="n">callstack</span><span class="o">|</span>
</span><span class='line'>  <span class="c1"># custom stuff</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Very cool, this is super extensible and adaptable to whatever kinds of behaviors a developer might want.</p>

<h3>Proc</h3>

<p>I should take a brief aside to talk about Procs since they may or may not be used a lot in the code you&rsquo;ve come across (but will be everywhere in the Rails source).</p>

<p>You know how we like to deal with objects, bundling up data and code into a package that represents a conceptual unit of some kind?  Well, a <code>Proc</code> or <code>Lambda</code> gives us the ability to make an object out of some code which we can then pass around to other methods.  This is why Ruby is described as having &ldquo;first-class functions&rdquo; (meaning it doesn&rsquo;t treat them as second-class citizens, but they can be arguments to other functions).  Those functions which take functions for arguments are then called &ldquo;higher order functions&rdquo;, which Ruby has a metric ton of (think <code>map</code>, <code>inject</code>, and on and on&hellip;).  For a thorough overview of the ways to pass around code in Ruby, check out this article on <a href="http://www.skorks.com/2010/05/ruby-procs-and-lambdas-and-the-difference-between-them/">Skorks</a>.</p>

<p>Bottom line, they are awesome and come in handy.</p>

<h3>Alias Method Chaining</h3>

<p>Another thing I found interesting in my study of the Deprecation subsystem was the convenient tools provided for deprecating methods.  It gives a chance to look into some metaprogramming, which is always fun.</p>

<p>Let&rsquo;s say we were the designers of a module called Fred which we declared as follows (example from source comments):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">Fred</span>
</span><span class='line'>  <span class="kp">extend</span> <span class="nb">self</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">foo</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">bar</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">baz</span><span class="p">;</span> <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Pretty awesome module right?</p>

<p>As time went on, we realized that we wanted to get users of our module to move away from <code>Fred#foo</code>.  With active_support, we could just:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Deprecation</span><span class="o">.</span><span class="n">deprecate_methods</span><span class="p">(</span><span class="no">Fred</span><span class="p">,</span> <span class="ss">foo</span><span class="p">:</span> <span class="s1">&#39;use Bar#foo instead&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now when someone tries to use our method, they will be encouraged to make the switch:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="no">Fred</span><span class="o">.</span><span class="n">foo</span>
</span><span class='line'><span class="c1"># =&gt; &quot;DEPRECATION WARNING: foo is deprecated and will be removed from Rails 4.1 (use Bar#foo instead).&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>But, how does it do that?  It turns out it uses a very common pattern in Ruby metaprogramming:</p>

<ul>
<li>alias the original method to another name</li>
<li>insert a method into the module that wraps&hellip;</li>
<li>call whatever new logic you want</li>
<li>call the original method, now aliased</li>
</ul>


<p>Here&rsquo;s the code that does it:</p>

<figure class='code'><figcaption><span>active_support/deprecation/method_wrappers.rb</span><a href='https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/deprecation/method_wrappers.rb'>link</a></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">module</span> <span class="nn">ActiveSupport</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">Deprecation</span>
</span><span class='line'>    <span class="k">module</span> <span class="nn">MethodWrapper</span>
</span><span class='line'>      <span class="k">def</span> <span class="nf">deprecate_methods</span><span class="p">(</span><span class="n">target_module</span><span class="p">,</span> <span class="o">*</span><span class="n">method_names</span><span class="p">)</span>
</span><span class='line'>        <span class="n">options</span> <span class="o">=</span> <span class="n">method_names</span><span class="o">.</span><span class="n">extract_options!</span>
</span><span class='line'>        <span class="n">deprecator</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">delete</span><span class="p">(</span><span class="ss">:deprecator</span><span class="p">)</span> <span class="o">||</span> <span class="ss">ActiveSupport</span><span class="p">:</span><span class="ss">:Deprecation</span><span class="o">.</span><span class="n">instance</span>
</span><span class='line'>        <span class="n">method_names</span> <span class="o">+=</span> <span class="n">options</span><span class="o">.</span><span class="n">keys</span>
</span><span class='line'>
</span><span class='line'>        <span class="n">method_names</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">method_name</span><span class="o">|</span>
</span><span class='line'>          <span class="n">target_module</span><span class="o">.</span><span class="n">alias_method_chain</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="ss">:deprecation</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">target</span><span class="p">,</span> <span class="n">punctuation</span><span class="o">|</span>
</span><span class='line'>            <span class="n">target_module</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="ss">:define_method</span><span class="p">,</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">target</span><span class="si">}</span><span class="s2">_with_deprecation</span><span class="si">#{</span><span class="n">punctuation</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">do</span> <span class="o">|*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="o">|</span>
</span><span class='line'>              <span class="n">deprecator</span><span class="o">.</span><span class="n">deprecation_warning</span><span class="p">(</span><span class="n">method_name</span><span class="p">,</span> <span class="n">options</span><span class="o">[</span><span class="n">method_name</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>              <span class="nb">send</span><span class="p">(</span><span class="ss">:&quot;</span><span class="si">#{</span><span class="n">target</span><span class="si">}</span><span class="ss">_without_deprecation</span><span class="si">#{</span><span class="n">punctuation</span><span class="si">}</span><span class="ss">&quot;</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>            <span class="k">end</span>
</span><span class='line'>          <span class="k">end</span>
</span><span class='line'>        <span class="k">end</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>We see our familiar friend <code>extract_options!</code> doing it&rsquo;s job, and then a default for the deprecator that is going to do the work.  The real bulk of the work is in the enumeration through the method_names.  Matching up the logic there with my description of the pattern above we see:</p>

<ul>
<li><code>alias_method_chain</code> creates both aliases for us, it&rsquo;s found in <a href="https://github.com/rails/rails/blob/4-0-stable/activesupport/lib/active_support/core_ext/module/aliasing.rb">core_ext/module/aliasing.rb</a></li>
<li><code>.send(:define_method, ...with_deprecation)</code> makes the wrapper method</li>
<li><code>deprecation_warning</code> actually generates the event for whatever behavior handler picks it up</li>
<li><code>.send(:...without_deprecation)</code> then calls the original method</li>
</ul>


<p>We will see this quite a bit I&rsquo;m sure, as it&rsquo;s a really handy way to put a wrapper around a method.</p>

<h3>Rails 4</h3>

<p>I may not have mentioned this, but all of this series is on the Rails 4 source.  I&rsquo;m sure we will come across areas where it will behave differently than your installed Rails.  In that case, use the Rails-Dev-Box that we setup in <a href="http://www.zhubert.com/blog/2013/05/11/reading-the-source-of-ruby-on-rails/">Part 1</a>.  I have been using it a lot thoughout this exploration.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'><span class="nb">cd </span>rails-dev-bex
</span><span class='line'>vagrant up
</span><span class='line'>vagrant ssh
</span><span class='line'><span class="nb">cd</span> /vagrant/rails
</span><span class='line'>./tools/console
</span></code></pre></td></tr></table></div></figure>


<p>Voila, Rails 4 source console all loaded and ready for experimentation.</p>

<p>Have fun reading the source!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: thanks, try, tap]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/16/rails-source-activesupport-part-6/"/>
    <updated>2013-05-16T16:22:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/16/rails-source-activesupport-part-6</id>
    <content type="html"><![CDATA[<p>The more time I spend with the Rails source, the more I appreciate it.  I&rsquo;ve always appreciated it for what it could do, but now I&rsquo;m appreciating it directly, for what it <em>is</em>. I find it to be quite elegant, pragmatic, aesthetically pleasing, and educational.  Inside the black box, it&rsquo;s really quite nice.</p>

<p>So&hellip;<em>thank you</em> to all of the people that continue to make it better and to DHH and 37Signals for leading the charge.  It&rsquo;s a really great framework to use and study.</p>

<h3>Hash#to_param</h3>

<p>The first source fragment for today is a method responsible for URL generation of query strings from a <code>Hash</code>&hellip;something which I&rsquo;m confident I&rsquo;ve rolled my own at least once.  It&rsquo;s important to realize that many of the core objects have methods like <code>to_param</code> and <code>to_query</code> and that they all work in concert to handle the arbitrary structure we might throw at it, but we are just examining this one.  Check out to_param.rb and to_query.rb for more type specific implementations.</p>

<p>(from core_ext/object/to_param.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Hash</span>
</span><span class='line'>  <span class="c1"># Returns a string representation of the receiver suitable for use as a URL</span>
</span><span class='line'>  <span class="c1"># query string:</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   {name: &#39;David&#39;, nationality: &#39;Danish&#39;}.to_param</span>
</span><span class='line'>  <span class="c1">#   # =&gt; &quot;name=David&amp;nationality=Danish&quot;</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># The string pairs &quot;key=value&quot; that conform the query string</span>
</span><span class='line'>  <span class="c1"># are sorted lexicographically in ascending order.</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># This method is also aliased as +to_query+.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">to_param</span><span class="p">(</span><span class="n">namespace</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">)</span>
</span><span class='line'>    <span class="n">collect</span> <span class="k">do</span> <span class="o">|</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="o">|</span>
</span><span class='line'>      <span class="n">value</span><span class="o">.</span><span class="n">to_query</span><span class="p">(</span><span class="n">namespace</span> <span class="p">?</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="n">namespace</span><span class="si">}</span><span class="s2">[</span><span class="si">#{</span><span class="n">key</span><span class="si">}</span><span class="s2">]&quot;</span> <span class="p">:</span> <span class="n">key</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span><span class="o">.</span><span class="n">sort!</span> <span class="o">*</span> <span class="s1">&#39;&amp;&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Calling <code>collect</code> with a block on a <code>Hash</code> gives easy access to key value pairs.  There are many ways to do that, but it&rsquo;s neat to learn another way.  It is also interesting that the block also has a postfix operation tacked onto it.  Take a look at <code>end.sort! * '&amp;'</code>.  We can reason pretty easily about what that does (sort in place and join the array with ampersands).</p>

<p>That said, I don&rsquo;t think I&rsquo;ve ever used <code>array * str</code> before and I rarely postfix a multiline block.  I think I have been using far more temporary variables than I really need to&hellip;</p>

<p>See the <a href="http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-2A">Array docs</a> for more details.</p>

<h3>Object#try</h3>

<p>I know that I have littered my code with existence checks&hellip;things like:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="vi">@person</span><span class="o">.</span><span class="n">name</span> <span class="k">if</span> <span class="vi">@person</span> <span class="o">&amp;&amp;</span> <span class="vi">@person</span><span class="o">.</span><span class="n">respond_to?</span><span class="p">(</span><span class="ss">:name</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Thankfully, there&rsquo;s a better way baked into every object&hellip;try!</p>

<p>(from core_ext/object/try.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Object</span>
</span><span class='line'>  <span class="c1"># Invokes the public method whose name goes as first argument just like</span>
</span><span class='line'>  <span class="c1"># +public_send+ does, except that if the receiver does not respond to it the</span>
</span><span class='line'>  <span class="c1"># call returns +nil+ rather than raising an exception.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">try</span><span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">a</span><span class="o">.</span><span class="n">empty?</span> <span class="o">&amp;&amp;</span> <span class="nb">block_given?</span>
</span><span class='line'>      <span class="k">yield</span> <span class="nb">self</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="n">public_send</span><span class="p">(</span><span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">b</span><span class="p">)</span> <span class="k">if</span> <span class="nb">respond_to?</span><span class="p">(</span><span class="n">a</span><span class="o">.</span><span class="n">first</span><span class="p">)</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So for my egregious code above, I can use the cleaner:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="vi">@person</span><span class="o">.</span><span class="n">try</span><span class="p">(</span><span class="ss">:name</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Much better!</p>

<h3>String#indent</h3>

<p>This next code fragment has a method <em>I have never seen before</em>.  How cool is that?</p>

<p>(from string/indent.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">String</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">indent!</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">indent_string</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="n">indent_empty_lines</span><span class="o">=</span><span class="kp">false</span><span class="p">)</span>
</span><span class='line'>    <span class="n">indent_string</span> <span class="o">=</span> <span class="n">indent_string</span> <span class="o">||</span> <span class="nb">self</span><span class="o">[</span><span class="sr">/^[ \t]/</span><span class="o">]</span> <span class="o">||</span> <span class="s1">&#39; &#39;</span>
</span><span class='line'>    <span class="n">re</span> <span class="o">=</span> <span class="n">indent_empty_lines</span> <span class="p">?</span> <span class="sr">/^/</span> <span class="p">:</span> <span class="sr">/^(?!$)/</span>
</span><span class='line'>    <span class="nb">gsub!</span><span class="p">(</span><span class="n">re</span><span class="p">,</span> <span class="n">indent_string</span> <span class="o">*</span> <span class="n">amount</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>  <span class="c1"># tons of docs removed for brevity</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">indent</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">indent_string</span><span class="o">=</span><span class="kp">nil</span><span class="p">,</span> <span class="n">indent_empty_lines</span><span class="o">=</span><span class="kp">false</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">dup</span><span class="o">.</span><span class="n">tap</span> <span class="p">{</span><span class="o">|</span><span class="n">_</span><span class="o">|</span> <span class="n">_</span><span class="o">.</span><span class="n">indent!</span><span class="p">(</span><span class="n">amount</span><span class="p">,</span> <span class="n">indent_string</span><span class="p">,</span> <span class="n">indent_empty_lines</span><span class="p">)}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ok, so the actual presence of <code>String#indent</code> is rather helpful and it does pretty much exactly what you think it does&hellip;but hold up&hellip;what is <code>tap</code>?</p>

<h3>Object#tap</h3>

<p>From the docs:</p>

<blockquote><p>Yields x to the block, and then returns x. The primary purpose of this method is to &#8220;tap into&#8221; a method chain, in order to perform operations on intermediate results within the chain.</p></blockquote>


<p>This clever bit of code seems to come from <a href="http://moonbase.rydia.net/mental/blog/programming/eavesdropping-on-expressions">MenTaLguY</a> where you&rsquo;ll also find other cool uses for it described.</p>

<p>Like, simple debugging without breaking stuff:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">foo</span> <span class="o">=</span> <span class="o">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="o">]</span>
</span><span class='line'><span class="n">foo</span><span class="o">.</span><span class="n">tap</span><span class="p">{</span><span class="o">|</span><span class="n">_</span><span class="o">|</span> <span class="nb">puts</span> <span class="s2">&quot;inspecting </span><span class="si">#{</span><span class="n">_</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">}</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">x</span><span class="o">|</span>
</span><span class='line'> <span class="c1"># ...</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>In the case of indent, since it taps into a destructive method (<code>indent!</code>) it changes the string while remaining chainable.</p>

<p>That&rsquo;s all for now, have fun reading the source!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: Delegate for Demeter]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/15/rails-source-activesupport-part-5/"/>
    <updated>2013-05-15T21:19:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/15/rails-source-activesupport-part-5</id>
    <content type="html"><![CDATA[<p>This next post is going to be about one macro only&hellip;and it is a very special one if you like to obey the <a href="http://en.wikipedia.org/wiki/Law_of_Demeter">Law of Demeter</a>.  It has 130 lines of comments explaining it&rsquo;s usage before it&rsquo;s finally declared.  It is, the one and only, Module#delegate.</p>

<p>You might wonder why this is on Module instead of Class.  Well, Class inherits from Module, so it will get all the constants and methods declared there. <a href="http://matt.aimonetti.net/posts/2012/07/30/ruby-class-module-mixins/">Matt Aimonetti</a> has a good write up on the distinction between the two, culminating in, &ldquo;whenever you don’t create instances of a class, please don’t use a class.&rdquo;  Since delegate is really just method passing, it doesn&rsquo;t need an instance so Module scope it is.</p>

<h3>Module#delegate usage</h3>

<p>By way of reminder, delegate is used like this (from the 130 lines of comments):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Greeter</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">hello</span>
</span><span class='line'>    <span class="s1">&#39;hello&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">goodbye</span>
</span><span class='line'>    <span class="s1">&#39;goodbye&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">class</span> <span class="nc">Foo</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:greeter</span>
</span><span class='line'>  <span class="n">delegate</span> <span class="ss">:hello</span><span class="p">,</span> <span class="n">to</span><span class="p">:</span> <span class="ss">:greeter</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="no">Foo</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">hello</span>   <span class="c1"># =&gt; &quot;hello&quot;</span>
</span><span class='line'><span class="no">Foo</span><span class="o">.</span><span class="n">new</span><span class="o">.</span><span class="n">goodbye</span> <span class="c1"># =&gt; NoMethodError: undefined method `goodbye&#39; for #&lt;Foo:0x1af30c&gt;</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>It allows you to abide by the Law of Demeter by only knowing about the interface to the second object rather than the implementation details in your collaborating object.   Seeing code like <code>Foo.new.greeter.hello</code> with all those dot dot dot dots is a good indication that Demeter is going to get pissed off (I like to anthropomorphize Demeter).</p>

<h3>Implementing Module#delegate</h3>

<p>Take a deep breath.  Hold it&hellip;let it out.  Find your happy place.  Ok, now you&rsquo;re ready to tackle this magical beast.</p>

<p>We begin with the ever present options hash parsing and validation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Module</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">delegate</span><span class="p">(</span><span class="o">*</span><span class="nb">methods</span><span class="p">)</span>
</span><span class='line'>    <span class="n">options</span> <span class="o">=</span> <span class="nb">methods</span><span class="o">.</span><span class="n">pop</span>
</span><span class='line'>    <span class="k">unless</span> <span class="n">options</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">=</span> <span class="n">options</span><span class="o">[</span><span class="ss">:to</span><span class="o">]</span>
</span><span class='line'>      <span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">,</span> <span class="s1">&#39;Delegation needs a target. Supply an options hash with a :to key as the last argument (e.g. delegate :hello, to: :greeter).&#39;</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">prefix</span><span class="p">,</span> <span class="n">allow_nil</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">values_at</span><span class="p">(</span><span class="ss">:prefix</span><span class="p">,</span> <span class="ss">:allow_nil</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Oh, I should mention, there are a ton of ways to configure the delegate macro.  In case you want to modify the names of the methods created you can specify a &ldquo;prefix&rdquo; as per below:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">if</span> <span class="n">prefix</span> <span class="o">==</span> <span class="kp">true</span> <span class="o">&amp;&amp;</span> <span class="n">to</span> <span class="o">=~</span> <span class="sr">/^[^a-z_]/</span>
</span><span class='line'>  <span class="k">raise</span> <span class="no">ArgumentError</span><span class="p">,</span> <span class="s1">&#39;Can only automatically set the delegation prefix when delegating to a method.&#39;</span>
</span><span class='line'><span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="n">method_prefix</span> <span class="o">=</span> <span class="p">\</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">prefix</span>
</span><span class='line'>    <span class="s2">&quot;</span><span class="si">#{</span><span class="n">prefix</span> <span class="o">==</span> <span class="kp">true</span> <span class="p">?</span> <span class="n">to</span> <span class="p">:</span> <span class="n">prefix</span><span class="si">}</span><span class="s2">_&quot;</span>
</span><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="s1">&#39;&#39;</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>That <code>method_prefix</code> is an interesting piece of syntax.  It could have been written as a ternary but using the line continuation and indentation I could see the reasoning that it perhaps is a bit more readable.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">file</span><span class="p">,</span> <span class="n">line</span> <span class="o">=</span> <span class="nb">caller</span><span class="o">.</span><span class="n">first</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">&#39;:&#39;</span><span class="p">,</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="n">line</span> <span class="o">=</span> <span class="n">line</span><span class="o">.</span><span class="n">to_i</span>
</span><span class='line'>
</span><span class='line'><span class="n">to</span> <span class="o">=</span> <span class="n">to</span><span class="o">.</span><span class="n">to_s</span>
</span><span class='line'><span class="n">to</span> <span class="o">=</span> <span class="s1">&#39;self.class&#39;</span> <span class="k">if</span> <span class="n">to</span> <span class="o">==</span> <span class="s1">&#39;class&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The above just sets up some variables that we will need below, specifically where we are pointing to and where &ldquo;we&rdquo; are located for error reporting (as we&rsquo;ve seen before with <code>class_eval</code>, we have <code>module_eval</code> below).</p>

<h3>Version 1: Nil Result is OK</h3>

<p>There are two conditions in the code&hellip;whether we want to raise an exception on a <code>nil</code> or just roll with it.  The easier case is also the first one, so we see it first below:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="nb">methods</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="nb">method</span><span class="o">|</span>
</span><span class='line'>  <span class="c1"># Attribute writer methods only accept one argument. Makes sure []=</span>
</span><span class='line'>  <span class="c1"># methods still accept two arguments.</span>
</span><span class='line'>  <span class="n">definition</span> <span class="o">=</span> <span class="p">(</span><span class="nb">method</span> <span class="o">=~</span> <span class="sr">/[^\]]=$/</span><span class="p">)</span> <span class="p">?</span> <span class="s1">&#39;arg&#39;</span> <span class="p">:</span> <span class="s1">&#39;*args, &amp;block&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># The following generated methods call the target exactly once, storing</span>
</span><span class='line'>  <span class="c1"># the returned value in a dummy variable.</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># Reason is twofold: On one hand doing less calls is in general better.</span>
</span><span class='line'>  <span class="c1"># On the other hand it could be that the target has side-effects,</span>
</span><span class='line'>  <span class="c1"># whereas conceptualy, from the user point of view, the delegator should</span>
</span><span class='line'>  <span class="c1"># be doing one call.</span>
</span><span class='line'>  <span class="k">if</span> <span class="n">allow_nil</span>
</span><span class='line'>    <span class="nb">module_eval</span><span class="p">(</span><span class="o">&lt;&lt;-</span><span class="no">EOS</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">line</span> <span class="o">-</span> <span class="mi">3</span><span class="p">)</span>
</span><span class='line'><span class="sh">      def #{method_prefix}#{method}(#{definition})        # def customer_name(*args, &amp;block)</span>
</span><span class='line'><span class="sh">        _ = #{to}                                         #   _ = client</span>
</span><span class='line'><span class="sh">        if !_.nil? || nil.respond_to?(:#{method})         #   if !_.nil? || nil.respond_to?(:name)</span>
</span><span class='line'><span class="sh">          _.#{method}(#{definition})                      #     _.name(*args, &amp;block)</span>
</span><span class='line'><span class="sh">        end                                               #   end</span>
</span><span class='line'><span class="sh">      end                                                 # end</span>
</span><span class='line'><span class="no">    EOS</span>
</span></code></pre></td></tr></table></div></figure>


<p>Ok.  That&rsquo;s some crazy stuff right there but if you look at the example on the right it totally makes sense.  We are using <code>module_eval</code> to create a new method from the <code>EOS</code> here-doc that we provide.  Since a here document is just a big string, we get to shove in all sorts of interpolation.  From above, we specified the optional prefix which the example shows as <code>customer_</code>, the method of <code>name</code> and then the definition/signature of that method comes out of the regular expression ternary.  That regular expression is just checking whether our method is an attribute writer which should just have one <code>arg</code>.  It&rsquo;s unclear to me why <code>_ = #{to}</code> is necessary (as opposed to throwing more interpolations on the next two lines), but it could be for readability as well.</p>

<p>A few lines of meta and now we have a nice way to avoid Law of Demeter violations.  Use it!</p>

<h3>Version 2: Freak out on Nil</h3>

<p>There is a second code path for #delegate, which you can see below.  It&rsquo;s the version which freaks out when it encounters a <code>nil</code> on the collaborator&rsquo;s method.  You can see the extra logic below.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">else</span>
</span><span class='line'>    <span class="n">exception</span> <span class="o">=</span> <span class="sx">%(raise &quot;</span><span class="si">#{</span><span class="nb">self</span><span class="si">}</span><span class="sx">#</span><span class="si">#{</span><span class="n">method_prefix</span><span class="si">}#{</span><span class="nb">method</span><span class="si">}</span><span class="sx"> delegated to </span><span class="si">#{</span><span class="n">to</span><span class="si">}</span><span class="sx">.</span><span class="si">#{</span><span class="nb">method</span><span class="si">}</span><span class="sx">, but </span><span class="si">#{</span><span class="n">to</span><span class="si">}</span><span class="sx"> is nil: </span><span class="se">\#</span><span class="sx">{self.inspect}&quot;)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nb">module_eval</span><span class="p">(</span><span class="o">&lt;&lt;-</span><span class="no">EOS</span><span class="p">,</span> <span class="n">file</span><span class="p">,</span> <span class="n">line</span> <span class="o">-</span> <span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="sh">      def #{method_prefix}#{method}(#{definition})        # def customer_name(*args, &amp;block)</span>
</span><span class='line'><span class="sh">        _ = #{to}                                         #   _ = client</span>
</span><span class='line'><span class="sh">        _.#{method}(#{definition})                        #   _.name(*args, &amp;block)</span>
</span><span class='line'><span class="sh">      rescue NoMethodError                                # rescue NoMethodError</span>
</span><span class='line'><span class="sh">        if _.nil?                                         #   if _.nil?</span>
</span><span class='line'><span class="sh">          #{exception}                                    #     # add helpful message to the exception</span>
</span><span class='line'><span class="sh">        else                                              #   else</span>
</span><span class='line'><span class="sh">          raise                                           #     raise</span>
</span><span class='line'><span class="sh">        end                                               #   end</span>
</span><span class='line'><span class="sh">      end                                                 # end</span>
</span><span class='line'><span class="no">    EOS</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>It is really easy to understand now that we&rsquo;ve broken down the first one.</p>

<p>That&rsquo;s all for now, have fun reading the source!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: Hash Extensions]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/13/rails-source-activesupport-part-4/"/>
    <updated>2013-05-13T14:51:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/13/rails-source-activesupport-part-4</id>
    <content type="html"><![CDATA[<p>At RailsConf this year, Aaron Patterson talked a bit about &ldquo;aggressively trimming negativity&rdquo; from his life and focusing on the positive things.  I&rsquo;m working on that as well, which is part of the genesis of this Rails source journal.  People like to complain about things, the more familiar the more often it sometimes seems.  Before I started this project, I&rsquo;d fill gaps in time with reading Hacker News, but the negativity really wore on me.  Now, I instead get to go digging for really cool stuff in Rails that informs my every day work.  I love it.</p>

<h3>Recursive Hash Merging</h3>

<p>For instance, last night I came across this cool bit of recursion in the deep merge extension to Hash:</p>

<p>(from core_ext/hash/deep_merge.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Hash</span>
</span><span class='line'>  <span class="c1"># Returns a new hash with +self+ and +other_hash+ merged recursively.</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   h1 = { x: { y: [4,5,6] }, z: [7,8,9] }</span>
</span><span class='line'>  <span class="c1">#   h2 = { x: { y: [7,8,9] }, z: &#39;xyz&#39; }</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   h1.deep_merge(h2) #=&gt; {x: {y: [7, 8, 9]}, z: &quot;xyz&quot;}</span>
</span><span class='line'>  <span class="c1">#   h2.deep_merge(h1) #=&gt; {x: {y: [4, 5, 6]}, z: [7, 8, 9]}</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">deep_merge!</span><span class="p">(</span><span class="n">other_hash</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="n">other_hash</span><span class="o">.</span><span class="n">each_pair</span> <span class="k">do</span> <span class="o">|</span><span class="n">k</span><span class="p">,</span><span class="n">v</span><span class="o">|</span>
</span><span class='line'>      <span class="n">tv</span> <span class="o">=</span> <span class="nb">self</span><span class="o">[</span><span class="n">k</span><span class="o">]</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">tv</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">v</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span>
</span><span class='line'>        <span class="nb">self</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="n">tv</span><span class="o">.</span><span class="n">deep_merge</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nb">self</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="n">block</span> <span class="o">&amp;&amp;</span> <span class="n">tv</span> <span class="p">?</span> <span class="n">block</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">k</span><span class="p">,</span> <span class="n">tv</span><span class="p">,</span> <span class="n">v</span><span class="p">)</span> <span class="p">:</span> <span class="n">v</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>    <span class="nb">self</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Having recently finished &ldquo;The Little Schemer&rdquo;, I loved seeing recursion pop out of my Rails source journey, especially so quickly!  The pattern for understanding a good recursive function from TLS is quite simply:</p>

<ul>
<li>always ask two questions: are we done? and else (because else is always the second question)</li>
<li>always progress towards termination via changing an argument each recursion (which is in the else)</li>
</ul>


<p>Ok, now go buy &ldquo;The Little Schemer&rdquo;, it&rsquo;s really that good&hellip;did I mention it&rsquo;s written in the Socratic style?</p>

<p>Back to our regularly scheduled program&hellip;&ldquo;Deep&rdquo; as a prefix generally means that it&rsquo;s applied at every level of a nested data structure, so this deep merge method wants to apply at every level.  Does it meet TLS guidelines?  Of course!  Each_pair is guaranteed to terminate when the keys are exhausted so at the outer level we are fine.  Inside the pairwise block we see recursion applied when either hash&rsquo;s value is a Hash.  So our done condition is really &ldquo;am I not a hash?&rdquo; with an else of &ldquo;merge the subhashes and reduce my hash key space by one key.&rdquo;</p>

<p>There&rsquo;s some extra functionality here with the optional block format (trimmed here for brevity), but that is pretty cool too.  Many many things in the source are <em>permissive</em> by nature&hellip;want to pass in a block to override the logic?  Go right ahead!  Again, more Ruby is nice.</p>

<h3>Default all the things!</h3>

<p>I seem to be drawn to pointing out all the ways you can manage to set defaults inside a method.  Here&rsquo;s another!</p>

<p>(from core_ext/hash/reverse_merge.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Hash</span>
</span><span class='line'>  <span class="c1"># Merges the caller into +other_hash+. For example,</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   options = options.reverse_merge(size: 25, velocity: 10)</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># is equivalent to</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   options = { size: 25, velocity: 10 }.merge(options)</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># This is particularly useful for initializing an options hash</span>
</span><span class='line'>  <span class="c1"># with default values.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">reverse_merge!</span><span class="p">(</span><span class="n">other_hash</span><span class="p">)</span>
</span><span class='line'>    <span class="c1"># right wins if there is no left</span>
</span><span class='line'>    <span class="n">merge!</span><span class="p">(</span> <span class="n">other_hash</span> <span class="p">){</span><span class="o">|</span><span class="n">key</span><span class="p">,</span><span class="n">left</span><span class="p">,</span><span class="n">right</span><span class="o">|</span> <span class="n">left</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>This would be handy in those cases where I have a bunch of defaults that I want to set and I want to make it clear logically which hash is overriding which.  It has an alias of <code>reverse_update!</code>, which may be a bit easier to remember.</p>

<h3>Roll your own strong params</h3>

<p>Since I haven&rsquo;t made it to any of the actual framework code, it&rsquo;s very possible that this is used in strong params, but regardless, check it out!  Hash#slice gives you a convenient way to limit the keys of a hash to a specified superset.  That could be quite handy for&hellip;wait for it&hellip;OPTIONS HASHES!</p>

<p>(from core_ext/hash/slice.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Hash</span>
</span><span class='line'>  <span class="c1"># Slice a hash to include only the given keys. This is useful for</span>
</span><span class='line'>  <span class="c1"># limiting an options hash to valid keys before passing to a method:</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   def search(criteria = {})</span>
</span><span class='line'>  <span class="c1">#     criteria.assert_valid_keys(:mass, :velocity, :time)</span>
</span><span class='line'>  <span class="c1">#   end</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   search(options.slice(:mass, :velocity, :time))</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1"># If you have an array of keys you want to limit to, you should splat them:</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   valid_keys = [:mass, :velocity, :time]</span>
</span><span class='line'>  <span class="c1">#   search(options.slice(*valid_keys))</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">slice</span><span class="p">(</span><span class="o">*</span><span class="n">keys</span><span class="p">)</span>
</span><span class='line'>    <span class="n">keys</span><span class="o">.</span><span class="n">map!</span> <span class="p">{</span> <span class="o">|</span><span class="n">key</span><span class="o">|</span> <span class="n">convert_key</span><span class="p">(</span><span class="n">key</span><span class="p">)</span> <span class="p">}</span> <span class="k">if</span> <span class="nb">respond_to?</span><span class="p">(</span><span class="ss">:convert_key</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span>
</span><span class='line'>    <span class="n">keys</span><span class="o">.</span><span class="n">each_with_object</span><span class="p">(</span><span class="nb">self</span><span class="o">.</span><span class="n">class</span><span class="o">.</span><span class="n">new</span><span class="p">)</span> <span class="p">{</span> <span class="o">|</span><span class="n">k</span><span class="p">,</span> <span class="nb">hash</span><span class="o">|</span> <span class="nb">hash</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="o">=</span> <span class="nb">self</span><span class="o">[</span><span class="n">k</span><span class="o">]</span> <span class="k">if</span> <span class="n">has_key?</span><span class="p">(</span><span class="n">k</span><span class="p">)</span> <span class="p">}</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Reading the implementation, it&rsquo;s kind of neat the reversal that happens in that last line.  Rather than trimming the existing hash, it pulls a Judo move and builds a new Hash with only the keys that pass the <code>has_key?</code> check.  I have to think that is to reduce the number of iterations and make the code a tiny bit more performant.</p>

<p>That&rsquo;s all for now, my pup wants to play.</p>

<p>Until next time, have fun reading the source!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: Humor, Defaults, Security]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/13/rails-source-activesupport-part-3/"/>
    <updated>2013-05-13T14:51:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/13/rails-source-activesupport-part-3</id>
    <content type="html"><![CDATA[<p>Reading the source of Rails gives insight into the minds of the contributors over the years.  It lets you know how they like to write code (of course), but it also gives you little glimpses into the personalities of particular people who shaped Rails in big and small ways.  As a reader, you walk away from comment reading sessions knowing just a little bit more about the code, and the people behind it.</p>

<h3>Reading code is fun</h3>

<p>For instance, I learned that DHH thinks like a human:</p>

<p>(from array/prepend_and_append.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Array</span>
</span><span class='line'>  <span class="c1"># The human way of thinking about adding stuff to the end of a list is with append</span>
</span><span class='line'>  <span class="n">alias_method</span> <span class="ss">:append</span><span class="p">,</span>  <span class="ss">:&lt;&lt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This is something I really enjoy about the Ruby community: a clever sense of humor and a goal to be nice like Matz.  If you&rsquo;re looking for evidence of &lsquo;nice&rsquo;, you only need to take a cursory glance at the source comments&hellip;very generous in their detail, very helpful.</p>

<!-- more -->


<h3>Hash#fetch for defaults</h3>

<p>Moving on, I&rsquo;ve come across the following pattern a few times&hellip;I believe one time was while watching <a href="http://www.rubytapas.com/episodes">Ruby Tapas</a> episode 12, and the other was probably during a <a href="https://www.destroyallsoftware.com/screencasts/catalog">DestroyAllSoftware</a> screencast, but it&rsquo;s cool enough to highlight every time.</p>

<p>Why do:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">foo</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">)</span>
</span><span class='line'>    <span class="n">options</span> <span class="o">=</span> <span class="n">args</span><span class="o">.</span><span class="n">extract_options!</span>
</span><span class='line'>    <span class="n">options</span><span class="o">[</span><span class="ss">:rush</span><span class="o">]</span> <span class="o">=</span> <span class="s2">&quot;rules&quot;</span> <span class="k">unless</span> <span class="n">options</span><span class="o">[</span><span class="ss">:rush</span><span class="o">]</span>
</span><span class='line'>    <span class="c1"># or a bit better syntax but messy to chain</span>
</span><span class='line'>    <span class="n">options</span><span class="o">[</span><span class="ss">:neil_peart</span><span class="o">]</span> <span class="o">||=</span> <span class="s2">&quot;best drummer ever&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>When you could do?  (from class/attribute.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">class_attribute</span><span class="p">(</span><span class="o">*</span><span class="n">attrs</span><span class="p">)</span>
</span><span class='line'>    <span class="n">options</span> <span class="o">=</span> <span class="n">attrs</span><span class="o">.</span><span class="n">extract_options!</span>
</span><span class='line'>    <span class="c1"># double assignment is used to avoid &quot;assigned but unused variable&quot; warning</span>
</span><span class='line'>    <span class="n">instance_reader</span> <span class="o">=</span> <span class="n">instance_reader</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:instance_accessor</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:instance_reader</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span>
</span><span class='line'>    <span class="n">instance_writer</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:instance_accessor</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:instance_writer</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span>
</span><span class='line'>    <span class="n">instance_predicate</span> <span class="o">=</span> <span class="n">options</span><span class="o">.</span><span class="n">fetch</span><span class="p">(</span><span class="ss">:instance_predicate</span><span class="p">,</span> <span class="kp">true</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Hurray for fetch for defaults!  Nice and clean&hellip;as long as you don&rsquo;t look at the double assignment thing there.  Ignore those ;)</p>

<h3>Meta with Module#class_eval</h3>

<p>The next little piece of code showcases the dynamic nature of Ruby as well as some metaprogramming essentials.  Here a class is opened up and a new class level attribute is shoved onto it (if it doesn&rsquo;t already exist) and then a method to access said attribute is defined.</p>

<p>(from class/attribute_accessors.rb)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">def</span> <span class="nf">cattr_reader</span><span class="p">(</span><span class="o">*</span><span class="n">syms</span><span class="p">)</span>
</span><span class='line'>    <span class="n">options</span> <span class="o">=</span> <span class="n">syms</span><span class="o">.</span><span class="n">extract_options!</span>
</span><span class='line'>    <span class="n">syms</span><span class="o">.</span><span class="n">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">sym</span><span class="o">|</span>
</span><span class='line'>      <span class="k">raise</span> <span class="no">NameError</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s2">&quot;invalid class attribute name: </span><span class="si">#{</span><span class="n">sym</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span> <span class="k">unless</span> <span class="n">sym</span> <span class="o">=~</span> <span class="sr">/^[_A-Za-z]\w*$/</span>
</span><span class='line'>      <span class="nb">class_eval</span><span class="p">(</span><span class="o">&lt;&lt;-</span><span class="no">EOS</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">,</span> <span class="bp">__LINE__</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="sh">        unless defined? @@#{sym}</span>
</span><span class='line'><span class="sh">          @@#{sym} = nil</span>
</span><span class='line'><span class="sh">        end</span>
</span><span class='line'>
</span><span class='line'><span class="sh">        def self.#{sym}</span>
</span><span class='line'><span class="sh">          @@#{sym}</span>
</span><span class='line'><span class="sh">        end</span>
</span><span class='line'><span class="no">      EOS</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">unless</span> <span class="n">options</span><span class="o">[</span><span class="ss">:instance_reader</span><span class="o">]</span> <span class="o">==</span> <span class="kp">false</span> <span class="o">||</span> <span class="n">options</span><span class="o">[</span><span class="ss">:instance_accessor</span><span class="o">]</span> <span class="o">==</span> <span class="kp">false</span>
</span><span class='line'>        <span class="nb">class_eval</span><span class="p">(</span><span class="o">&lt;&lt;-</span><span class="no">EOS</span><span class="p">,</span> <span class="bp">__FILE__</span><span class="p">,</span> <span class="bp">__LINE__</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="sh">          def #{sym}</span>
</span><span class='line'><span class="sh">            @@#{sym}</span>
</span><span class='line'><span class="sh">          end</span>
</span><span class='line'><span class="no">        EOS</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>For clarity, Module#class_eval takes optional arguments of filename and line number for showing error messages.  I was curious about the <code>__FILE__, __LINE__ + 1</code> first time I saw that, so that&rsquo;s the reason for it.</p>

<h3>Parsing XML Safely</h3>

<p>Remember back a few months when all those security CVEs where coming out?  There were a few exploits related to arbitrary code execution and a denial of service from parsing XML.  Well lo and behold, I just found some of the code that addresses those issues in hash/conversions.rb</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="k">class</span> <span class="nc">Hash</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">from_xml</span><span class="p">(</span><span class="n">xml</span><span class="p">,</span> <span class="n">disallowed_types</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">)</span>
</span><span class='line'>      <span class="no">ActiveSupport</span><span class="o">::</span><span class="no">XMLConverter</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">xml</span><span class="p">,</span> <span class="n">disallowed_types</span><span class="p">)</span><span class="o">.</span><span class="n">to_h</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1"># Builds a Hash from XML just like &lt;tt&gt;Hash.from_xml&lt;/tt&gt;, but also allows Symbol and YAML.</span>
</span><span class='line'>    <span class="k">def</span> <span class="nf">from_trusted_xml</span><span class="p">(</span><span class="n">xml</span><span class="p">)</span>
</span><span class='line'>      <span class="n">from_xml</span> <span class="n">xml</span><span class="p">,</span> <span class="o">[]</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'><span class="k">module</span> <span class="nn">ActiveSupport</span>
</span><span class='line'>  <span class="k">class</span> <span class="nc">XMLConverter</span> <span class="c1"># :nodoc:</span>
</span><span class='line'>    <span class="k">class</span> <span class="nc">DisallowedType</span> <span class="o">&lt;</span> <span class="no">StandardError</span>
</span><span class='line'>      <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">type</span><span class="p">)</span>
</span><span class='line'>        <span class="k">super</span> <span class="s2">&quot;Disallowed type attribute: </span><span class="si">#{</span><span class="n">type</span><span class="o">.</span><span class="n">inspect</span><span class="si">}</span><span class="s2">&quot;</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="no">DISALLOWED_TYPES</span> <span class="o">=</span> <span class="sx">%w(symbol yaml)</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">def</span> <span class="nf">initialize</span><span class="p">(</span><span class="n">xml</span><span class="p">,</span> <span class="n">disallowed_types</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">)</span>
</span><span class='line'>      <span class="vi">@xml</span> <span class="o">=</span> <span class="n">normalize_keys</span><span class="p">(</span><span class="no">XmlMini</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">xml</span><span class="p">))</span>
</span><span class='line'>      <span class="vi">@disallowed_types</span> <span class="o">=</span> <span class="n">disallowed_types</span> <span class="o">||</span> <span class="no">DISALLOWED_TYPES</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>    <span class="kp">private</span>
</span><span class='line'>      <span class="k">def</span> <span class="nf">process_hash</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">value</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="s1">&#39;type&#39;</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">value</span><span class="o">[</span><span class="s1">&#39;type&#39;</span><span class="o">].</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="vi">@disallowed_types</span><span class="o">.</span><span class="n">include?</span><span class="p">(</span><span class="n">value</span><span class="o">[</span><span class="s1">&#39;type&#39;</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>          <span class="k">raise</span> <span class="no">DisallowedType</span><span class="p">,</span> <span class="n">value</span><span class="o">[</span><span class="s1">&#39;type&#39;</span><span class="o">]</span>
</span><span class='line'>        <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here you can see how the security hole was patched up:</p>

<ul>
<li>fork the from_xml method into a untrusted and trusted version</li>
<li>blacklist certain types that could be specified in an XML document</li>
<li>raise the <code>DisallowedType</code> exception if we encounter one of those while trying to parse</li>
</ul>


<p>There&rsquo;s more to it than the code shown here, but nonetheless, you get the gist.  Very approachable solution, I like it.</p>

<p>That&rsquo;s all for now, still a ways to go in ActiveSupport but I think I&rsquo;m about half way through the core extensions.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ActiveSupport: Array Extensions]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/12/rails-source-activesupport-part-2/"/>
    <updated>2013-05-12T15:03:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/12/rails-source-activesupport-part-2</id>
    <content type="html"><![CDATA[<p>It seems like such a simple thing, but I&rsquo;m really enjoying reading the source of Rails.  I&rsquo;m finding all sorts of hidden gems (ouch).</p>

<p>For instance, check out this interesting extension added to Array in &ldquo;core_ext/array/extract_options.rb&rdquo;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Array</span>
</span><span class='line'>  <span class="c1"># Extracts options from a set of arguments. Removes and returns the last</span>
</span><span class='line'>  <span class="c1"># element in the array if it&#39;s a hash, otherwise returns a blank hash.</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   def options(*args)</span>
</span><span class='line'>  <span class="c1">#     args.extract_options!</span>
</span><span class='line'>  <span class="c1">#   end</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   options(1, 2)        # =&gt; {}</span>
</span><span class='line'>  <span class="c1">#   options(1, 2, a: :b) # =&gt; {:a=&gt;:b}</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">extract_options!</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">last</span><span class="o">.</span><span class="n">is_a?</span><span class="p">(</span><span class="no">Hash</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">last</span><span class="o">.</span><span class="n">extractable_options?</span>
</span><span class='line'>      <span class="n">pop</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="p">{}</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>I think I&rsquo;ve rolled my own version of this at least a few times after seeing too many arguments in the signature.</p>

<p>Or consider this clever extension in &ldquo;core_ext/array/grouping.rb&rdquo;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="c1"># Divides the array into one or more subarrays based on a delimiting +value+</span>
</span><span class='line'>  <span class="c1"># or the result of an optional block.</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   [1, 2, 3, 4, 5].split(3)              # =&gt; [[1, 2], [4, 5]]</span>
</span><span class='line'>  <span class="c1">#   (1..10).to_a.split { |i| i % 3 == 0 } # =&gt; [[1, 2], [4, 5], [7, 8], [10]]</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">split</span><span class="p">(</span><span class="n">value</span> <span class="o">=</span> <span class="kp">nil</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">block</span><span class="p">)</span>
</span><span class='line'>    <span class="n">inject</span><span class="p">(</span><span class="o">[[]]</span><span class="p">)</span> <span class="k">do</span> <span class="o">|</span><span class="n">results</span><span class="p">,</span> <span class="n">element</span><span class="o">|</span>
</span><span class='line'>      <span class="k">if</span> <span class="n">block</span> <span class="o">&amp;&amp;</span> <span class="n">block</span><span class="o">.</span><span class="n">call</span><span class="p">(</span><span class="n">element</span><span class="p">)</span> <span class="o">||</span> <span class="n">value</span> <span class="o">==</span> <span class="n">element</span>
</span><span class='line'>        <span class="n">results</span> <span class="o">&lt;&lt;</span> <span class="o">[]</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="n">results</span><span class="o">.</span><span class="n">last</span> <span class="o">&lt;&lt;</span> <span class="n">element</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>      <span class="n">results</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Having just gone through &ldquo;Learn You a Haskell for Great Good&rdquo;, I&rsquo;ve been wanting to see some Ruby examples in the wild of something which should be familiar to the functional and/or lispy crowds.  Since Enumerable#inject is not used as much as it should be, let&rsquo;s review it&rsquo;s usage.</p>

<p>Inject (also called reduce) takes an enumerable (a thing which meets a couple requirements but basically means you can iterate over) and applies an operation to all of it&rsquo;s elements and accumulates a resulting value.   Simple case:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">inject</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="ss">:+</span><span class="p">)</span> <span class="c1"># =&gt; 0 + 1 + 2 + 3 + 4 + 5 = 15</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can also leave off the accumulator if the first element of your enum is an acceptable starting accumulator, so the above could be</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">reduce</span><span class="p">(</span><span class="ss">:+</span><span class="p">)</span> <span class="c1"># =&gt; 1 + 2 + 3 + 4 + 5 = 15</span>
</span></code></pre></td></tr></table></div></figure>


<p>In addition, it can take a block instead of a binary operation:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="p">(</span><span class="mi">1</span><span class="o">.</span><span class="n">.</span><span class="mi">5</span><span class="p">)</span><span class="o">.</span><span class="n">reduce</span> <span class="p">{</span><span class="o">|</span><span class="n">results</span><span class="p">,</span><span class="n">x</span><span class="o">|</span> <span class="n">results</span> <span class="o">+</span> <span class="n">x</span> <span class="p">}</span> <span class="c1"># =&gt; 15</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now that we&rsquo;ve reviewed that, we can see the cleverness in Array#split.  It has a starting accumulator of <code>[[]]</code> and instead of a simple binary operation <code>:+</code> it takes a block and applies it to each element in enum.  That&rsquo;s where the logic happens, if the block returns a truthy value, we start a new empty array in the accumulator, otherwise we push the element onto the last array in the accumulator.</p>

<p>That&rsquo;s it for now!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reading the Source of Ruby on Rails]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/11/reading-the-source-of-ruby-on-rails/"/>
    <updated>2013-05-11T09:58:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/11/reading-the-source-of-ruby-on-rails</id>
    <content type="html"><![CDATA[<p>I have decided to read the whole source of Ruby on Rails and make notes as I work my way through it.  I have used the framework for far too long without doing such an obvious step and have just accepted the &ldquo;magic&rdquo; of how things work.  Well, I&rsquo;d like to see how the magic is made, and perhaps in so doing, I can become more useful as a Rubyist.  These posts are going to read more like a journal, as that&rsquo;s precisely what they are.</p>

<p>First step, setup an environment in which to really dig into Rails, in this case, I&rsquo;m going to use the <a href="https://github.com/rails/rails-dev-box">Rails-Dev-Box</a> which is recommended for contributors.</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ: Development <span class="nv">$&gt;</span> git clone https://github.com/rails/rails-dev-box.git
</span><span class='line'><span class="c"># stuff happens</span>
</span><span class='line'>λ: Development <span class="nv">$&gt;</span> <span class="nb">cd </span>rails-dev-box
</span><span class='line'>λ: rails-dev-box - master <span class="nv">$&gt;</span> vagrant up
</span><span class='line'><span class="c"># vagrant and puppet stuff happens</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>Then I go to GitHub and fork the rails repo into my account and continue:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='bash'><span class='line'>λ: rails-dev-box - master <span class="nv">$&gt;</span> ls
</span><span class='line'>README.md   Vagrantfile puppet
</span><span class='line'>λ: rails-dev-box - master <span class="nv">$&gt;</span> git clone git@github.com:zhubert/rails.git
</span><span class='line'><span class="c"># much downloading</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once that is complete, I have a rails directory that my Vagrant box can access and which is readily accessible from my host machine for code reading.  Of course, I don&rsquo;t need the Vagrant setup for just reading, but I&rsquo;d like to be able to experiment with Rails master in a nicely controlled environment, so I&rsquo;ll sink the extra 3 minutes to get it setup.</p>

<p>I open up my trusty editor and realize I need to pick a starting place to my code read through.</p>

<p><img src="http://www.zhubert.com/images/getting_started_rails.png" width="720" height="450" title="'Getting Started'" ></p>

<p>As you can see, Rails is a nicely structured code base, in fact, it&rsquo;s organized like a bunch of gems (how Ruby like!).  In the very top level there are some helpful Markdown formatted files as well as the entire source for the super awesome Guides.  If you haven&rsquo;t read the <a href="http://guides.rubyonrails.org">Guides</a> then I would definitely recommend doing that first.  Digging into the source is a good thing to do once you have a good mental image for the whole system.  Moving on&hellip;</p>

<p>To me, it feels like a good idea to start with the extensions that have been added, so I&rsquo;m not confused by those later on, so I jump right into &ldquo;active_support/core_ext&rdquo;.  This could be a sub-par approach, but I won&rsquo;t know until I&rsquo;ve read through everything and I want to just get going.</p>

<p>First impression: this is really well commented code.  I&rsquo;m excited to dig in.  I start in &ldquo;active_support/core_ext/array/access.rb&rdquo;</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="k">class</span> <span class="nc">Array</span>
</span><span class='line'>  <span class="c1"># Returns the tail of the array from +position+.</span>
</span><span class='line'>  <span class="c1">#</span>
</span><span class='line'>  <span class="c1">#   %w( a b c d ).from(0)  # =&gt; [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;d&quot;]</span>
</span><span class='line'>  <span class="c1">#   %w( a b c d ).from(2)  # =&gt; [&quot;c&quot;, &quot;d&quot;]</span>
</span><span class='line'>  <span class="c1">#   %w( a b c d ).from(10) # =&gt; []</span>
</span><span class='line'>  <span class="c1">#   %w().from(0)           # =&gt; []</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">from</span><span class="p">(</span><span class="n">position</span><span class="p">)</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">[</span><span class="n">position</span><span class="p">,</span> <span class="n">length</span><span class="o">]</span> <span class="o">||</span> <span class="o">[]</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Just the right amount of fore matter, and a good sense of humor to boot:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'>  <span class="c1"># Equal to &lt;tt&gt;self[41]&lt;/tt&gt;. Also known as accessing &quot;the reddit&quot;.</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">forty_two</span>
</span><span class='line'>    <span class="nb">self</span><span class="o">[</span><span class="mi">41</span><span class="o">]</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>That&rsquo;s all for now, off to enjoy Saturday sun (a rarity in Seattle)!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Bat Cave, Part 1: Objects]]></title>
    <link href="http://zhubert.github.io/blog/2013/05/08/the-bat-cave-part-1/"/>
    <updated>2013-05-08T09:49:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2013/05/08/the-bat-cave-part-1</id>
    <content type="html"><![CDATA[<p>When it comes to javascript frameworks, there&rsquo;s really no substitute for reading the source.  So in this series of posts, I&rsquo;m going to dig into the source for <a href="http://batmanjs.org">Batman.js</a>, and hopefully come away with a better understanding of how it all works <em>so that</em> I can make better use of it.</p>

<!-- more -->


<p>I want to start with one of the building blocks, Batman.Object, which is used for <em>many</em> things.  They, themselves, are built from smaller atoms:</p>

<ul>
<li>Batman.Object is composed of&hellip;

<ul>
<li>&#95;batman &ndash; stores hidden state (observers, accessors)

<ul>
<li>Namespace &ndash; global namespace reference</li>
</ul>
</li>
<li>Utilities &ndash; generally useful stuff (extend, mixin, etc)</li>
<li>EventEmitter &ndash; on, once, mutation, prevent, allow, fire

<ul>
<li>Event &ndash; encapsulates handlers with allow/prevent mechanics and fire triggers</li>
</ul>
</li>
<li>Observable &ndash; generic mixin for observing properties

<ul>
<li>Property &ndash; getter, setter

<ul>
<li>PropertyEvent &ndash; some overrides on Event

<ul>
<li>Event</li>
</ul>
</li>
<li>EventEmitter

<ul>
<li>Event</li>
</ul>
</li>
<li>SimpleSet &ndash; set atomic with add, remove, indexedBy, merge, clear, forEach, find, sort

<ul>
<li>Enumerable &ndash; map, every, some, reduce, filter</li>
<li>SimpleHash &ndash; hash atomic with has, add, remove, find, forEach, merge, toArray, sortedBy</li>
</ul>
</li>
<li>Developer &ndash; wrapper for communicating to the console, deprecations, logging, etc</li>
</ul>
</li>
<li>Keypath &ndash; dot separated properties

<ul>
<li>Property</li>
</ul>
</li>
</ul>
</li>
<li>SimpleHash</li>
</ul>
</li>
</ul>


<p>Ok, there is a lot to digest there, but I think we can boil it down to the following major categories of functionality:</p>

<ul>
<li>Batman.Object provides&hellip;

<ul>
<li>Events &ndash; a triggering mechanism to say when something has happened</li>
<li>Observable &ndash; a way to keep track of who to tell about events and what properties they care about</li>
<li>Properties &ndash; storage and composition of properties</li>
</ul>
</li>
</ul>


<p>Let&rsquo;s take a look at the last one first, since it&rsquo;ll be easier that way.  First up, I need a Batman.Object:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Batman</span><span class="p">.</span><span class="nb">Object</span><span class="p">()</span>
</span><span class='line'><span class="err">#</span><span class="o">=&gt;</span> <span class="nx">BatmanObject</span> <span class="p">{</span><span class="nx">_batman</span><span class="o">:</span> <span class="nx">_Batman</span><span class="p">,</span> <span class="nx">constructor</span><span class="o">:</span> <span class="kd">function</span><span class="p">,</span> <span class="nx">_batman</span><span class="o">:</span> <span class="nx">_Batman</span><span class="p">,</span> <span class="nx">_defineAccessor</span><span class="o">:</span> <span class="kd">function</span><span class="p">,</span> <span class="nx">_defineWrapAccessor</span><span class="o">:</span> <span class="kd">function</span><span class="err">…</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we can give it a property with an initial value:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;rush&#39;</span><span class="p">,</span><span class="s1">&#39;rocks&#39;</span><span class="p">)</span>
</span><span class='line'><span class="err">#</span><span class="o">=&gt;</span> <span class="s2">&quot;rocks&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Easy right?  But what really happened?  Because Object mixed in Observable, it has a <code>set()</code> method which passes on to Property a <code>setValue()</code>, of course, no such property &ldquo;rush&rdquo; exists, so it is dynamically initialized as a new property which gets hidden into <code>@_batman.properties</code> as a SimpleHash.  How can we tell?</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">_batman</span><span class="p">.</span><span class="nx">properties</span>
</span><span class='line'><span class="err">#</span><span class="o">=&gt;</span> <span class="nx">SimpleHash</span> <span class="p">{</span><span class="nx">_storage</span><span class="o">:</span> <span class="nb">Object</span><span class="p">,</span> <span class="nx">length</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="p">...}</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">_batman</span><span class="p">.</span><span class="nx">properties</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;rush&#39;</span><span class="p">)</span>
</span><span class='line'><span class="err">#</span><span class="o">=&gt;</span> <span class="nx">Keypath</span> <span class="p">{</span><span class="nx">segments</span><span class="o">:</span> <span class="nb">Array</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="nx">depth</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="nx">base</span><span class="o">:</span> <span class="nx">BatmanObject</span><span class="p">,</span> <span class="nx">key</span><span class="o">:</span> <span class="s2">&quot;rush&quot;</span><span class="p">,</span> <span class="nx">_accessor</span><span class="o">:</span> <span class="nb">Object</span><span class="err">…</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>A depth 1 Keypath defers back to <code>super</code> in nearly every case, so we can think of that as just referencing the Property.</p>

<p>You&rsquo;ll never need to use this, because it&rsquo;s all hidden in the handy accessor:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;rush&#39;</span><span class="p">)</span>
</span><span class='line'><span class="err">#</span><span class="o">=&gt;</span> <span class="s2">&quot;rocks&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>But that is how Batman implements the actual storage of your property.</p>

<p>That&rsquo;s great, but that is also sort of the easy part.  How do Objects interact and share data between them?</p>

<p>One way is via direct observation, like so:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">foo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Batman</span><span class="p">.</span><span class="nb">Object</span><span class="p">({</span><span class="s1">&#39;dial&#39;</span><span class="o">:</span> <span class="mi">10</span><span class="p">});</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">bar</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Batman</span><span class="p">.</span><span class="nb">Object</span><span class="p">({</span><span class="s1">&#39;dial&#39;</span><span class="o">:</span> <span class="mi">0</span><span class="p">});</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">observe</span><span class="p">(</span><span class="s1">&#39;dial&#39;</span><span class="p">,</span><span class="kd">function</span><span class="p">(</span><span class="nx">newValue</span><span class="p">,</span><span class="nx">oldValue</span><span class="p">){</span>
</span><span class='line'>  <span class="nx">bar</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;dial&#39;</span><span class="p">,</span><span class="nx">newValue</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s1">&#39;dial&#39;</span><span class="p">,</span><span class="mi">11</span><span class="p">)</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;dial&#39;</span><span class="p">)</span> <span class="err">#</span><span class="o">=&gt;</span> <span class="mi">11</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s1">&#39;dial&#39;</span><span class="p">)</span> <span class="err">#</span><span class="o">=&gt;</span> <span class="mi">11</span>
</span></code></pre></td></tr></table></div></figure>


<p>Two objects foo and bar each have the property &lsquo;dial&rsquo;, and when foo notices a change in it&rsquo;s own dial, it tells bar to change it&rsquo;s value.</p>

<p>This is all well and good, but I would never want to write that code in a real app.  Foo needing to know that Bar cares about it&rsquo;s value changes could get messy really quickly.  I&rsquo;d much rather Bar be in change of registering for changes to Foo.  That is precisely what <code>@accessor</code> gives you.  Hold on to your hats, time to go even deeper in the cave&hellip;</p>

<p>We start by making a class with a Property we care about:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="c1"># Note, switched to Coffeescript</span>
</span><span class='line'><span class="k">class</span> <span class="nx">Foo</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nb">Object</span>
</span><span class='line'>  <span class="nx">@accessor</span> <span class="s">&#39;dial&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And a second class that wants to be updated when the first class changes:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">Bar</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nb">Object</span>
</span><span class='line'>  <span class="nx">@accessor</span> <span class="s">&#39;foo&#39;</span>
</span><span class='line'>  <span class="nx">@accessor</span> <span class="s">&#39;computedDial&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;foo.dial&#39;</span><span class="p">)</span> <span class="o">+</span> <span class="mi">3</span>
</span></code></pre></td></tr></table></div></figure>


<p>You might be tempted to think that this is all very linear&hellip;if I access &lsquo;computedDial&rsquo; it just goes and gets the data from Foo.  You&rsquo;d be wrong, in a good way, so don&rsquo;t feel bad :)</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">foo = </span><span class="k">new</span> <span class="nx">Foo</span><span class="p">({</span><span class="nv">dial: </span><span class="mi">10</span><span class="p">})</span> <span class="c1"># make an instance of Foo</span>
</span><span class='line'><span class="nv">bar = </span><span class="k">new</span> <span class="nx">Bar</span><span class="p">({</span><span class="nv">foo: </span><span class="nx">foo</span><span class="p">})</span> <span class="c1"># make an instance of Bar that likes foo</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s">&#39;dial&#39;</span><span class="p">,</span><span class="mi">11</span><span class="p">)</span> <span class="c1"># changing foo&#39;s property with the setter</span>
</span><span class='line'><span class="nx">bar</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;computedDial&#39;</span><span class="p">)</span> <span class="c1"># also changes the computed value</span>
</span><span class='line'><span class="c1">#=&gt; 14</span>
</span><span class='line'><span class="nx">foo</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s">&#39;dial&#39;</span><span class="p">,</span><span class="mi">12</span><span class="p">)</span>
</span><span class='line'><span class="c1"># what is the state of bar?</span>
</span></code></pre></td></tr></table></div></figure>


<p>What isn&rsquo;t immediately apparent is that bar knows that it&rsquo;s value for <code>@get('foo.dial')</code> has changed and thus it needs to recalculate computedDial.  It just defers that calculation until it&rsquo;s needed, but it has the cached value of dial on hand for when the next getter is called. In other words, foo pushed changes to bar.  This is vital for view binding (updating what appears on the screen in a template) as we&rsquo;ll see later.  How does it know how to do this?</p>

<p>In the source for Property.coffee we see:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'>  <span class="nv">getValue: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@registerAsMutableSource</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">unless</span> <span class="nx">@isCached</span><span class="p">()</span>
</span><span class='line'>      <span class="nx">@constructor</span><span class="p">.</span><span class="nx">pushSourceTracker</span><span class="p">()</span>
</span><span class='line'>      <span class="k">try</span>
</span><span class='line'>        <span class="vi">@value = </span><span class="nx">@valueFromAccessor</span><span class="p">()</span>
</span><span class='line'>        <span class="vi">@cached = </span><span class="kc">yes</span>
</span><span class='line'>      <span class="k">finally</span>
</span><span class='line'>        <span class="nx">@updateSourcesFromTracker</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">@value</span>
</span></code></pre></td></tr></table></div></figure>


<p>There&rsquo;s a lot there, but basically when I first request a value from my Bar accessor, Batman tells the distant property that I want to subscribe to changes to it.  This is done via EventEmitter working hand in hand with Property.</p>

<p>EventEmitter.coffee knows about mutation (changes):</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'>  <span class="nv">registerAsMutableSource: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">Batman</span><span class="p">.</span><span class="nx">Property</span><span class="p">.</span><span class="nx">registerSource</span><span class="p">(</span><span class="k">this</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Which Property.coffee then stores that source and adds the handlers:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'>  <span class="vi">@registerSource: </span><span class="nf">(obj) -&gt;</span>
</span><span class='line'>    <span class="c1"># omitting stuff...</span>
</span><span class='line'>    <span class="nx">set</span><span class="o">?</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">obj</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">updateSourcesFromTracker: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nv">newSources = </span><span class="nx">@constructor</span><span class="p">.</span><span class="nx">popSourceTracker</span><span class="p">()</span>
</span><span class='line'>    <span class="nv">handler = </span><span class="nx">@sourceChangeHandler</span><span class="p">()</span> <span class="c1"># this busts the cache</span>
</span><span class='line'>    <span class="nx">source</span><span class="o">?</span><span class="p">.</span><span class="nx">event</span><span class="p">(</span><span class="s">&#39;change&#39;</span><span class="p">).</span><span class="nx">removeHandler</span><span class="p">(</span><span class="nx">handler</span><span class="p">)</span> <span class="k">for</span> <span class="nx">source</span> <span class="k">in</span> <span class="nx">@sources</span> <span class="k">if</span> <span class="nx">@sources</span>
</span><span class='line'>    <span class="vi">@sources = </span><span class="nx">newSources</span>
</span><span class='line'>    <span class="nx">source</span><span class="o">?</span><span class="p">.</span><span class="nx">event</span><span class="p">(</span><span class="s">&#39;change&#39;</span><span class="p">).</span><span class="nx">addHandler</span><span class="p">(</span><span class="nx">handler</span><span class="p">)</span> <span class="k">for</span> <span class="nx">source</span> <span class="k">in</span> <span class="nx">@sources</span> <span class="k">if</span> <span class="nx">@sources</span>
</span></code></pre></td></tr></table></div></figure>


<p>To reiterate, when I call <code>bar.get('computedDial')</code> the first time, it gets registered as a MutableSource to the property &lsquo;dial&rsquo; on Foo.  The &lsquo;dial&rsquo; property then annotates that it has a new source to keep track of on a little set.</p>

<p>A very short time later, that set is iterated through registering change event handlers for each source.  In other words, Foo has an auto-updated list of other Objects that want to know when it registers a change.  So when a <code>set('dial',11)</code> happens, it fires the change event which is being listened to by the Bar accessor, which in turn updates Bar&rsquo;s cached value of dial and informs the previously calculated value &lsquo;computedDial&rsquo; that it is no longer accurate by setting cached to false.</p>

<p>I&rsquo;ll leave the Cave for now, but hopefully this was a good introduction to how Objects and Observations are actually implemented.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js Presentation at North County Full Stack]]></title>
    <link href="http://zhubert.github.io/blog/2013/03/02/batman-dot-js-presentation-at-north-county-full-stack/"/>
    <updated>2013-03-02T09:32:00-08:00</updated>
    <id>http://zhubert.github.io/blog/2013/03/02/batman-dot-js-presentation-at-north-county-full-stack</id>
    <content type="html"><![CDATA[<p>This last Thursday night, I gave a talk at the <a href="http://www.meetup.com/Full-Stack-North-County/">Full Stack: North County Meetup</a> on Batman.js.  Check it out <a href="http://www.zhubert.com/batman_preso">here</a>.</p>

<p>EDIT: It&rsquo;s worth mentioning that some slides have the down arrow illuminated, meaning you can navigate vertically as well.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js PushState]]></title>
    <link href="http://zhubert.github.io/blog/2012/11/29/batman-dot-js-pushstate/"/>
    <updated>2012-11-29T12:06:00-08:00</updated>
    <id>http://zhubert.github.io/blog/2012/11/29/batman-dot-js-pushstate</id>
    <content type="html"><![CDATA[<p>Not long after building something cool in Batman, you&rsquo;ll show it to a friend and they will invariably ask about the weird <code>/#!/</code> in the URL (it could just be the people I hang out with).</p>

<p>The hash-bang is quite easy to get rid of, but you need to be a little bit careful, as there are some things that can trip you up.</p>

<!-- more -->


<p>Let&rsquo;s start with the Batman side of things.  Go to your main app coffee file (mine is usually <code>app.js.coffee</code>) and let Batman know that you want to use the pushStateNavigator instead of hashBangNavigator:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/app.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'>  <span class="nv">Batman.config.usePushState = </span><span class="kc">yes</span>
</span><span class='line'>  <span class="nv">Batman.config.pathPrefix = </span><span class="s">&quot;/&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you have a simple app, that&rsquo;s it for Batman tweaks.  However, if you have other javascript libraries messing with your click events then you will be stuck scratching your head over the chaos that ensues (like the one that removes the delay for mobile devices).</p>

<p>At this point, if you start navigating through your Batman app, everything will work great&hellip;until you reload a page.  It&rsquo;s obvious of course, that if you reload <code>/posts/1</code> your browser is going to request an HTML version of that from the Rails server but since we just serve JSON from that endpoint, it will throw a 406 at us.</p>

<p>So, you could either add HTML endpoints to all your controllers with get&#8217;able targets, or use a handy Rails route trick:</p>

<figure class='code'><figcaption><span>app/config/routes.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'>  <span class="n">scope</span> <span class="ss">:format</span> <span class="o">=&gt;</span> <span class="kp">true</span><span class="p">,</span> <span class="ss">:constraints</span> <span class="o">=&gt;</span> <span class="p">{</span> <span class="ss">:format</span> <span class="o">=&gt;</span> <span class="s1">&#39;json&#39;</span> <span class="p">}</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">resources</span> <span class="ss">:posts</span> <span class="k">do</span>
</span><span class='line'>      <span class="n">resources</span> <span class="ss">:comments</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># route everything else to main#index, at the very end</span>
</span><span class='line'>  <span class="n">match</span> <span class="s2">&quot;*foo&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;main#index&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This makes it obvious to Rails that you only want JSON requests to match with your <code>PostsController</code> and <code>CommentsController</code> and that everything HTML should fall through to <code>MainController#index</code>.  Since Main bootstraps your Batman app, it should effectively handle those pesky reloads.</p>

<p>That&rsquo;s it!</p>

<p>Note: if you have handrolled requests on the Batman side (<code>$.get</code> or <code>$.post</code>), don&rsquo;t forget to append a <code>.json</code> onto the end of their URLs.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Watches Benchmark: A Ruby gem for avoiding performance regressions]]></title>
    <link href="http://zhubert.github.io/blog/2012/10/16/watches-benchmark-a-ruby-gem-for-avoiding-performance-regressions/"/>
    <updated>2012-10-16T17:02:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/10/16/watches-benchmark-a-ruby-gem-for-avoiding-performance-regressions</id>
    <content type="html"><![CDATA[<p>I have a pretty normal workflow&hellip;I work on something and then move on to something else.  While I always strive to minimize coupling, it&rsquo;s inevitable that sometimes those new things I work on effect the old.  Having good test coverage running under continuous integration catch the situations where I&rsquo;ve literally broken functionality, but what about the times when I&rsquo;ve simply made that old thing sluggish?</p>

<p>While there are all sorts of heavyweight tools for performance analysis, they mostly rely on me looking at them (a fatal flaw when what I want to look at is the new code I&rsquo;m writing).  Of course, I watch production performance like a hawk, but I&rsquo;d love to avoid the mad scramble to patch production due to an unforeseen performance regression.  What would be great would be an exception driven notification that radiates the information to me, rather than me having to dig through graphs to find it&hellip;in development when I&rsquo;m making the mistakes.</p>

<p>So, I made a super simple gem for the development environment that helps me keep my performance promises.  When I&rsquo;m building new functionality where performance is a sensitive issue, I simply assign that method an SLA and the simple gem <a href="https://github.com/zhubert/watches_benchmark">watches_benchmark</a> will tell me via Logger and Growl when I&rsquo;ve made a change that has broken the SLA.  Then I have causality to the performance regression and can fix it right away.</p>

<p>It&rsquo;s pretty rough cut and an imperfect solution (development environments have a tendency for variability), but I find that it has been helping me on my current project.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js Error Handling in the Controller]]></title>
    <link href="http://zhubert.github.io/blog/2012/09/24/batman-dot-js-error-handling-in-the-controller/"/>
    <updated>2012-09-24T19:36:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/09/24/batman-dot-js-error-handling-in-the-controller</id>
    <content type="html"><![CDATA[<p>Here is another thing that falls into the category of Things I&rsquo;ve Learned, fresh from Batman <a href="https://github.com/Shopify/batman/blob/master/CHANGELOG.md">0.13.0</a>:</p>

<ul>
<li>Add <code>Controller::handleError()</code>, <code>Controller::errorHandler()</code>, and <code>Controller.catchError</code> for regstering error handlers and wrapping callbacks to automatically handle errors coming back from async operations.</li>
</ul>


<!-- more -->


<p>This nifty addition from <a href="https://github.com/Shopify/batman/pull/538">kristianpd</a> and the fine folks at Shopify makes it so you can have <code>rescue_from</code> -like functionality in your Batman controllers.</p>

<p>Let&rsquo;s say you are concerned about 404s, which is a pretty reasonable status code to handle under all circumstances.  You would start by registering the error handling function and your intent to handle it:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/controllers/foo_controller.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">App</span><span class="p">.</span><span class="nx">FooController</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Controller</span>
</span><span class='line'>  <span class="vi">@logErrors: </span><span class="nf">(err) -&gt;</span>
</span><span class='line'>    <span class="nx">console</span><span class="o">?</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s">&#39;Errors: &#39;</span><span class="p">,</span> <span class="nx">err</span><span class="p">)</span>
</span><span class='line'>  <span class="nx">@catchError</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">StorageAdapter</span><span class="p">.</span><span class="nx">StorageError</span><span class="p">,</span> <span class="nv">with: </span><span class="nx">@logErrors</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we diverge from <code>rescue_from</code> a little bit&hellip;you need to wrap the callback which throws the error in order to handle it.  So, replace your lookup:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/controllers/foo_controller.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">App</span><span class="p">.</span><span class="nx">FooController</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Controller</span>
</span><span class='line'>  <span class="c1"># snip...</span>
</span><span class='line'>  <span class="nv">show: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">App</span><span class="p">.</span><span class="nx">Foo</span><span class="p">.</span><span class="nx">find</span> <span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">foo</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">@set</span> <span class="s">&#39;foo&#39;</span><span class="p">,</span> <span class="nx">foo</span>
</span></code></pre></td></tr></table></div></figure>


<p>With one that describes your intent to handle errors thrown in that block:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/controllers/foo_controller.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">App</span><span class="p">.</span><span class="nx">FooController</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Controller</span>
</span><span class='line'>  <span class="c1"># snip...</span>
</span><span class='line'>  <span class="nv">show: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">App</span><span class="p">.</span><span class="nx">Foo</span><span class="p">.</span><span class="nx">find</span> <span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nx">@errorHandler</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">foo</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">@set</span> <span class="s">&#39;foo&#39;</span><span class="p">,</span> <span class="nx">foo</span>
</span></code></pre></td></tr></table></div></figure>


<p>You can find the basic status code errors in the <a href="https://github.com/Shopify/batman/blob/master/src/model/storage_adapters/rest_storage.coffee">StorageAdapter</a> but that&rsquo;s just an example of using this for storage related errors.  You are free to make all sorts of custom errors and handle them just as you would these ones.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js Mixins]]></title>
    <link href="http://zhubert.github.io/blog/2012/09/18/batman-dot-js-mixins/"/>
    <updated>2012-09-18T17:15:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/09/18/batman-dot-js-mixins</id>
    <content type="html"><![CDATA[<p>Over the last several months, I&rsquo;ve been building an ambitious Batman.js and Rails app (it&rsquo;s going great!).  In the course of things, I needed a way to group similar functionality like I would in a <a href="https://github.com/rails/rails/blob/master/activesupport/lib/active_support/concern.rb">concern-based</a> module in Rails.  The <a href="https://github.com/Shopify/batman/blob/master/src/object.coffee">mixin</a> fits the bill perfectly.</p>

<p> <!-- more --></p>

<p>Let&rsquo;s say you have several Batman models that all have some attributes that share something in common, like maybe they have a common accessor to deal with an excessively terse status code:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/models/foo.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">Foo</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Model</span>
</span><span class='line'>  <span class="nx">@encode</span> <span class="s">&#39;status_code&#39;</span>
</span><span class='line'>  <span class="nx">@accessor</span> <span class="s">&#39;status_to_s&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nv">get: </span><span class="o">-&gt;</span>
</span><span class='line'>      <span class="k">switch</span> <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;status_code&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="k">when</span> <span class="s">&quot;G&quot;</span> <span class="k">then</span> <span class="s">&quot;Geddy&quot;</span>
</span><span class='line'>        <span class="k">when</span> <span class="s">&quot;L&quot;</span> <span class="k">then</span> <span class="s">&quot;Lifeson&quot;</span>
</span><span class='line'>        <span class="k">when</span> <span class="s">&quot;P&quot;</span> <span class="k">then</span> <span class="s">&quot;Peart&quot;</span>
</span><span class='line'>        <span class="k">else</span> <span class="s">&quot;Disregard&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Well, if <code>Foo</code> and <code>Bar</code> both need accessors like this, a mixin will enable you to share the code between them.</p>

<p>To start, I create a mixins directory at <code>app/assets/javascripts/batman/mixins</code> and then require it before my models, like so:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/application.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="c1">#= require app</span>
</span><span class='line'><span class="c1">#= require_tree ./batman/mixins</span>
</span><span class='line'><span class="c1">#= require_tree ./batman/models</span>
</span><span class='line'><span class="c1">#= require_tree ./batman/controllers</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then I can create the first mixin like so:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/mixins/status_code_mixin.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.StatusCode =</span>
</span><span class='line'>  <span class="nv">initialize: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@encode</span> <span class="s">&#39;status_code&#39;</span>
</span><span class='line'>    <span class="nx">@accessor</span> <span class="s">&#39;status_to_s&#39;</span><span class="p">,</span>
</span><span class='line'>      <span class="nv">get: </span><span class="o">-&gt;</span>
</span><span class='line'>        <span class="k">switch</span> <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;status_code&#39;</span><span class="p">)</span>
</span><span class='line'>          <span class="k">when</span> <span class="s">&quot;G&quot;</span> <span class="k">then</span> <span class="s">&quot;Geddy&quot;</span>
</span><span class='line'>          <span class="k">when</span> <span class="s">&quot;L&quot;</span> <span class="k">then</span> <span class="s">&quot;Lifeson&quot;</span>
</span><span class='line'>          <span class="k">when</span> <span class="s">&quot;P&quot;</span> <span class="k">then</span> <span class="s">&quot;Peart&quot;</span>
</span><span class='line'>          <span class="k">else</span> <span class="s">&quot;Disregard&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And include it in <code>Foo</code> and <code>Bar</code> with:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/models/foo.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">Foo</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Model</span>
</span><span class='line'>  <span class="nx">@classMixin</span> <span class="nx">App</span><span class="p">.</span><span class="nx">StatusCode</span>
</span></code></pre></td></tr></table></div></figure>


<p>Couldn&rsquo;t be easier to keep things DRY.</p>

<p>Of course, there are many ways to reduce code duplication and this is just one, but hopefully it helps you as much as it did me.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js and Rails Part 4, Associations]]></title>
    <link href="http://zhubert.github.io/blog/2012/08/19/batman-dot-js-and-rails-part-4/"/>
    <updated>2012-08-19T17:04:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/08/19/batman-dot-js-and-rails-part-4</id>
    <content type="html"><![CDATA[<p><a href="http://www.zhubert.com/blog/2012/05/12/batman-dot-js-and-rails-part-3/">Last time,</a> we looked at some basic CRUD views.  Let&rsquo;s extend this brain dead example by adding associations into the mix.</p>

<p>Since I have a Post model, it only makes sense to have a Comments model, where the Post <code>has_many</code> Comments and the Comment <code>belongs_to</code> one Post.</p>

<p>It is very easy.</p>

<p> <!-- more --></p>

<p><code>rails g resource comment content:string post_id:integer; rake db:migrate</code></p>

<figure class='code'><figcaption><span>app/controllers/comments_controller.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">CommentsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="n">respond_to</span> <span class="ss">:json</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="vi">@post</span> <span class="o">=</span> <span class="no">Post</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:post_id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_with</span><span class="p">(</span><span class="vi">@post</span><span class="p">,</span><span class="vi">@post</span><span class="o">.</span><span class="n">comments</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="vi">@comment</span> <span class="o">=</span> <span class="no">Comment</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_with</span> <span class="vi">@comment</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># for validation, can&#39;t use responders (batman expects errors to not have a root)</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>    <span class="vi">@post</span> <span class="o">=</span> <span class="no">Post</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:post_id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@comment</span> <span class="o">=</span> <span class="vi">@post</span><span class="o">.</span><span class="n">comments</span><span class="o">.</span><span class="n">build</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:comment</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>      <span class="k">if</span> <span class="vi">@comment</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@comment</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@comment</span><span class="o">.</span><span class="n">errors</span><span class="p">,</span> <span class="ss">:status</span> <span class="o">=&gt;</span> <span class="ss">:unprocessable_entity</span><span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># for validation, can&#39;t use responders (batman expects errors to not have a root)</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">update</span>
</span><span class='line'>    <span class="vi">@comment</span> <span class="o">=</span> <span class="no">Comment</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>      <span class="k">if</span> <span class="vi">@comment</span><span class="o">.</span><span class="n">update_attributes</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:comment</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@comment</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@comment</span><span class="o">.</span><span class="n">errors</span><span class="p">,</span> <span class="ss">:status</span> <span class="o">=&gt;</span> <span class="ss">:unprocessable_entity</span><span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># responder ok here</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">destroy</span>
</span><span class='line'>    <span class="vi">@comment</span> <span class="o">=</span> <span class="no">Comment</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_with</span><span class="p">(</span><span class="vi">@comment</span><span class="o">.</span><span class="n">post</span><span class="p">,</span><span class="vi">@comment</span><span class="o">.</span><span class="n">destroy</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>For this string of examples, we are using serializers (though I don&rsquo;t use them anymore for reasons I might explain later):</p>

<figure class='code'><figcaption><span>app/serializers/comment_serializer.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">CommentSerializer</span> <span class="o">&lt;</span> <span class="no">ActiveModel</span><span class="o">::</span><span class="no">Serializer</span>
</span><span class='line'>  <span class="n">attributes</span> <span class="ss">:content</span><span class="p">,</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:post_id</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the model is obvious&hellip;</p>

<figure class='code'><figcaption><span>app/models/comment.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Comment</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">attr_accessible</span> <span class="ss">:content</span>
</span><span class='line'>  <span class="n">validates_presence_of</span> <span class="ss">:content</span><span class="p">,</span> <span class="ss">:post_id</span>
</span><span class='line'>  <span class="n">belongs_to</span> <span class="ss">:post</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Tweak the post.rb to reflect the association</p>

<figure class='code'><figcaption><span>app/models/post.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">Post</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Base</span>
</span><span class='line'>  <span class="n">attr_accessible</span> <span class="ss">:content</span><span class="p">,</span> <span class="ss">:title</span>
</span><span class='line'>  <span class="n">has_many</span> <span class="ss">:comments</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>As are the routes, but this is stuff you already know.</p>

<figure class='code'><figcaption><span>config/routes.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'>  <span class="n">resources</span> <span class="ss">:posts</span> <span class="k">do</span>
</span><span class='line'>    <span class="n">resources</span> <span class="ss">:comments</span>
</span><span class='line'>  <span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>So how does Batman handle associations?  Well, you will be pleasantly surprised by how similar it is to Rails, here is how the route will look:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batty.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'>  <span class="nx">@resources</span> <span class="s">&#39;posts&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@resources</span> <span class="s">&#39;comments&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>The Batman model has all the things you&rsquo;d expect:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/models/comment.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">Batty</span><span class="p">.</span><span class="nx">Comment</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Model</span>
</span><span class='line'>  <span class="vi">@resourceName: </span><span class="s">&#39;comment&#39;</span>
</span><span class='line'>  <span class="vi">@storageKey: </span><span class="s">&#39;comments&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># saving everything to the Rails backend</span>
</span><span class='line'>  <span class="c1"># gives validation errors</span>
</span><span class='line'>  <span class="nx">@persist</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">RailsStorage</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># fields</span>
</span><span class='line'>  <span class="nx">@encode</span> <span class="s">&quot;content&quot;</span><span class="p">,</span> <span class="s">&quot;id&quot;</span><span class="p">,</span> <span class="s">&quot;post_id&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># validations</span>
</span><span class='line'>  <span class="nx">@validate</span> <span class="s">&quot;content&quot;</span><span class="p">,</span> <span class="nv">presence: </span><span class="kc">true</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># associations</span>
</span><span class='line'>  <span class="nx">@belongsTo</span> <span class="s">&#39;post&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nv">inverseOf: </span><span class="s">&#39;comments&#39;</span><span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># indicates that rails is nesting resources, shallow!</span>
</span><span class='line'>  <span class="nx">@urlNestsUnder</span> <span class="s">&#39;post&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And we have to tell the post model about its new association:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/models/post.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">Batty</span><span class="p">.</span><span class="nx">Post</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Model</span>
</span><span class='line'>  <span class="vi">@resourceName: </span><span class="s">&#39;post&#39;</span>
</span><span class='line'>  <span class="vi">@storageKey: </span><span class="s">&#39;posts&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">@persist</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">RailsStorage</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># fields</span>
</span><span class='line'>  <span class="nx">@encode</span> <span class="s">&quot;title&quot;</span><span class="p">,</span> <span class="s">&quot;content&quot;</span>
</span><span class='line'>  <span class="nx">@hasMany</span> <span class="s">&quot;comments&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># validations</span>
</span><span class='line'>  <span class="nx">@validate</span> <span class="s">&quot;title&quot;</span><span class="p">,</span> <span class="nv">presence: </span><span class="kc">true</span>
</span><span class='line'>  <span class="nx">@validate</span> <span class="s">&quot;content&quot;</span><span class="p">,</span> <span class="nv">presence: </span><span class="kc">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>And the controller also follows the RESTful form as exemplified in Rails:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/controllers/comments_controller.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">Batty</span><span class="p">.</span><span class="nx">CommentsController</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Controller</span>
</span><span class='line'>  <span class="nv">routingKey: </span><span class="s">&#39;comments&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">show: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nv">comment = </span><span class="k">new</span> <span class="nx">Batty</span><span class="p">.</span><span class="nx">Comment</span><span class="p">(</span><span class="nv">id: </span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nv">post_id: </span><span class="nx">params</span><span class="p">.</span><span class="nx">postId</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">comment</span><span class="p">.</span><span class="nx">load</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">result</span><span class="p">)</span>  <span class="o">=&gt;</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>      <span class="nx">@set</span> <span class="s">&#39;comment&#39;</span><span class="p">,</span> <span class="nx">result</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">edit: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nv">comment = </span><span class="k">new</span> <span class="nx">Batty</span><span class="p">.</span><span class="nx">Comment</span><span class="p">(</span><span class="nv">id: </span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="nv">post_id: </span><span class="nx">params</span><span class="p">.</span><span class="nx">postId</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">comment</span><span class="p">.</span><span class="nx">load</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">result</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>      <span class="nx">@set</span> <span class="s">&#39;comment&#39;</span><span class="p">,</span> <span class="nx">result</span>
</span><span class='line'>    <span class="vi">@form = </span><span class="nx">@render</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">new</span><span class="o">:</span> <span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">@set</span> <span class="s">&#39;comment&#39;</span><span class="p">,</span> <span class="k">new</span> <span class="nx">Batty</span><span class="p">.</span><span class="nx">Comment</span><span class="p">(</span><span class="nv">post_id: </span><span class="nx">params</span><span class="p">.</span><span class="nx">postId</span><span class="p">)</span>
</span><span class='line'>    <span class="vi">@form = </span><span class="nx">@render</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">create: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="vi">@new_comment = </span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;comment&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">@new_comment</span><span class="p">.</span><span class="nx">save</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">record</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s">&#39;#new_comment&#39;</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s">&#39;disabled&#39;</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">ErrorsSet</span>
</span><span class='line'>        <span class="c1">#@set &#39;comment&#39;, record</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">Batty</span><span class="p">.</span><span class="nx">flashSuccess</span> <span class="s">&quot;Comment created successfully!&quot;</span>
</span><span class='line'>        <span class="nx">@redirect</span> <span class="s">&#39;/posts/&#39;</span> <span class="o">+</span> <span class="nx">@new_comment</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;post_id&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">update: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="vi">@new_comment = </span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;comment&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">@new_comment</span><span class="p">.</span><span class="nx">save</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">record</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s">&#39;#new_comment&#39;</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s">&#39;disabled&#39;</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">ErrorsSet</span>
</span><span class='line'>        <span class="c1">#@set &#39;comment&#39;, record</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">Batty</span><span class="p">.</span><span class="nx">flashSuccess</span> <span class="s">&quot;Comment updated successfully!&quot;</span>
</span><span class='line'>        <span class="nx">@redirect</span> <span class="s">&#39;/posts/&#39;</span> <span class="o">+</span> <span class="nx">@new_comment</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;post_id&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">destroy: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="vi">@new_comment = </span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;comment&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">@new_comment</span><span class="p">.</span><span class="nx">destroy</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">ErrorsSet</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">Batty</span><span class="p">.</span><span class="nx">flashSuccess</span> <span class="s">&quot;Removed successfully!&quot;</span>
</span><span class='line'>        <span class="nx">@redirect</span> <span class="s">&#39;/posts/&#39;</span> <span class="o">+</span> <span class="nx">@new_comment</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;post_id&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>The views would get a bit tedious to put in here (check out Github for details), but a salient part to demonstrate is on posts#show:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/show.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'>  <span class="nt">%a</span><span class="nc">.btn.btn-primary</span><span class="p">{</span><span class="s1">&#39;data-route&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;routes.posts[post].comments.new&#39;</span><span class="p">}</span> New Comment
</span><span class='line'>
</span><span class='line'><span class="nc">.row</span>
</span><span class='line'>  <span class="nf">#content</span><span class="nc">.span12</span>
</span><span class='line'>    <span class="nf">#comments</span>
</span><span class='line'>      <span class="nt">%div</span><span class="p">{</span><span class="s2">&quot;data-foreach-comment&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.comments&quot;</span><span class="p">}</span>
</span><span class='line'>        <span class="nc">.comment</span><span class="p">{</span><span class="s2">&quot;data-partial&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;comments/_comment&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here you can see how we refer to an association for routing purposes (not good form to click off to a separate page, but keeping it basic) as well as iterating over the association for view partials.</p>

<p>To the Rails developer, Batman should feel like idiomatic Rails written in Coffeescript, with similar project layout, MVC definition, and convenient macros for the things you use regularly.  This association example demonstrates that it is exactly how you would expect it to work.  Minimizing surprise is definitely a strength of Batman.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js and Rails Part 3, Views]]></title>
    <link href="http://zhubert.github.io/blog/2012/05/12/batman-dot-js-and-rails-part-3/"/>
    <updated>2012-05-12T10:54:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/05/12/batman-dot-js-and-rails-part-3</id>
    <content type="html"><![CDATA[<p><a href="http://www.zhubert.com/blog/2012/05/12/batman-dot-js-and-rails-part-2/">Last time,</a>
 we quickly setup our app&rsquo;s models and controllers&hellip;noting that they looked very similar to their server-side brethren.</p>

<p>Now let&rsquo;s get some views&hellip;binding is done via HTML5 data- attributes, which is nice for your designer friends:</p>

<p> <!-- more --></p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/_post.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nc">.well</span>
</span><span class='line'>  <span class="nt">%h2</span>
</span><span class='line'>    <span class="nt">%a</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.title&quot;</span><span class="p">,</span> <span class="s2">&quot;data-route&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;routes.posts[post]&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="nt">%p</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.content&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="nt">%p</span><span class="nc">.details-link</span>
</span><span class='line'>    <span class="nt">%a</span><span class="nc">.btn</span><span class="p">{</span><span class="s2">&quot;data-route&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;routes.posts[post]&quot;</span><span class="p">}</span> View details »
</span></code></pre></td></tr></table></div></figure>


<p>So the above is a partial (but you already knew that by convention), that has examples of binding (model changes forces view update) and the Named Routing syntax of Batman. Makes sense.</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/index.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nt">%a</span><span class="nc">.btn.btn-primary</span><span class="p">{</span><span class="s2">&quot;data-route&quot;</span> <span class="o">=&gt;</span> <span class="s1">&#39;routes.posts.new&#39;</span><span class="p">}</span> New Post
</span><span class='line'><span class="nc">.row</span>
</span><span class='line'>  <span class="nf">#content</span><span class="nc">.span12</span>
</span><span class='line'>    <span class="nf">#posts</span>
</span><span class='line'>      <span class="nt">%div</span><span class="p">{</span><span class="s2">&quot;data-foreach-post&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;posts&quot;</span><span class="p">}</span>
</span><span class='line'>        <span class="nc">.post</span><span class="p">{</span><span class="s2">&quot;data-partial&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;posts/_post&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Check out how you iterate over &ldquo;enumerables&rdquo; and include partials.</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/edit.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nf">#edit-post</span><span class="nc">.row</span>
</span><span class='line'>  <span class="nf">#content</span><span class="nc">.span16</span>
</span><span class='line'>    <span class="nt">%form</span><span class="nf">#edit_post</span><span class="nc">.edit_post</span><span class="p">{</span><span class="s2">&quot;accept-charset&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;UTF-8&quot;</span><span class="p">,</span> <span class="s2">&quot;data-event-submit&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;update&quot;</span><span class="p">,</span> <span class="s2">&quot;data-formfor-post&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post&quot;</span><span class="p">}</span>
</span><span class='line'>      <span class="nt">%div</span><span class="p">{</span><span class="s2">&quot;data-partial&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;posts/_form&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Edit view includes a <code>_form</code> partial and wires the submit button to a particular controller action.</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/new.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nf">#new-post</span><span class="nc">.row</span>
</span><span class='line'>  <span class="nf">#content</span><span class="nc">.span16</span>
</span><span class='line'>    <span class="nt">%form</span><span class="nf">#new_post</span><span class="nc">.new_post</span><span class="p">{</span><span class="s2">&quot;accept-charset&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;UTF-8&quot;</span><span class="p">,</span> <span class="s2">&quot;data-event-submit&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;create&quot;</span><span class="p">,</span> <span class="s2">&quot;data-formfor-post&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post&quot;</span><span class="p">}</span>
</span><span class='line'>      <span class="nt">%div</span><span class="p">{</span><span class="s2">&quot;data-partial&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;posts/_form&quot;</span><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>New is the same as edit with some different classes and event.</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/show.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nc">.page-header</span>
</span><span class='line'>  <span class="nt">%h1</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.title&quot;</span><span class="p">}</span>
</span><span class='line'><span class="nc">.hero-unit</span>
</span><span class='line'>  <span class="nt">%p</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.content&quot;</span><span class="p">}</span>
</span><span class='line'><span class="nc">.well</span>
</span><span class='line'>  <span class="nt">%a</span><span class="nc">.btn.btn-primary</span><span class="p">{</span><span class="s2">&quot;data-route&quot;</span> <span class="o">=&gt;</span> <span class="s1">&#39;routes.posts[post].edit&#39;</span><span class="p">}</span>Edit
</span><span class='line'>  <span class="nt">%a</span><span class="nc">.btn</span><span class="p">{</span><span class="s1">&#39;data-route&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;routes.posts&#39;</span><span class="p">}</span>Back
</span><span class='line'>  <span class="nt">%a</span><span class="nc">.btn.destroy.btn-danger</span><span class="p">{</span><span class="s2">&quot;data-event-click&quot;</span> <span class="o">=&gt;</span> <span class="s1">&#39;destroy&#39;</span><span class="p">}</span> Destroy
</span></code></pre></td></tr></table></div></figure>


<p>Show is obvious. The destroy button isn&rsquo;t immediately obvious, but the Core team didn&rsquo;t like it routable so they suggest an event click. Works for me.</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/views/posts/_form.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nt">%fieldset</span>
</span><span class='line'>  <span class="nt">%legend</span>
</span><span class='line'>    <span class="nt">%span</span><span class="p">{</span><span class="s2">&quot;data-hideif&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.id&quot;</span><span class="p">}</span> New Post
</span><span class='line'>    <span class="nt">%span</span><span class="p">{</span><span class="s2">&quot;data-showif&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.id&quot;</span><span class="p">}</span> Edit Post
</span><span class='line'>  <span class="nf">#error-explanation</span><span class="nc">.alert-message.block-message.error</span><span class="p">{</span><span class="s2">&quot;data-showif&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.errors.length&quot;</span><span class="p">}</span>
</span><span class='line'>    <span class="nt">%p</span>
</span><span class='line'>      <span class="nt">%strong</span>
</span><span class='line'>        <span class="nt">%span</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.errors.length&quot;</span><span class="p">}</span>
</span><span class='line'>        <span class="nt">%span</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;&#39;error&#39; | pluralize post.errors.length&quot;</span><span class="p">}</span>
</span><span class='line'>        prevented this post from being created:
</span><span class='line'>    <span class="nt">%ul</span>
</span><span class='line'>      <span class="nt">%li</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;error.message&quot;</span><span class="p">,</span> <span class="s2">&quot;data-foreach-error&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.errors&quot;</span><span class="p">}</span>
</span><span class='line'>  <span class="nc">.clearfix</span><span class="p">{</span><span class="s2">&quot;data-addclass-error&quot;</span> <span class="o">=&gt;</span> <span class="s1">&#39;post.errors.title.length&#39;</span><span class="p">}</span>
</span><span class='line'>    <span class="nt">%label</span><span class="p">{</span><span class="ss">:for</span> <span class="o">=&gt;</span> <span class="s2">&quot;post_title&quot;</span><span class="p">}</span> Title
</span><span class='line'>    <span class="nc">.input</span>
</span><span class='line'>      <span class="nt">%input</span><span class="nf">#post_title</span><span class="nc">.span8</span><span class="p">{</span><span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.title&quot;</span><span class="p">,</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s2">&quot;post[title]&quot;</span><span class="p">,</span> <span class="ss">:size</span> <span class="o">=&gt;</span> <span class="s2">&quot;30&quot;</span><span class="p">,</span> <span class="ss">:type</span> <span class="o">=&gt;</span> <span class="s2">&quot;text&quot;</span><span class="p">}</span>
</span><span class='line'><span class="nt">%fieldset</span>
</span><span class='line'>  <span class="nc">.clearfix</span><span class="p">{</span><span class="s2">&quot;data-addclass-error&quot;</span> <span class="o">=&gt;</span> <span class="s1">&#39;post.errors.content.length&#39;</span><span class="p">}</span>
</span><span class='line'>    <span class="nt">%label</span><span class="p">{</span><span class="ss">:for</span> <span class="o">=&gt;</span> <span class="s2">&quot;post_content&quot;</span><span class="p">}</span> Description
</span><span class='line'>    <span class="nc">.input</span>
</span><span class='line'>      <span class="nt">%textarea</span><span class="nf">#post_content</span><span class="nc">.span8</span><span class="p">{</span><span class="ss">:cols</span> <span class="o">=&gt;</span> <span class="s2">&quot;40&quot;</span><span class="p">,</span> <span class="s2">&quot;data-bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;post.content&quot;</span><span class="p">,</span> <span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s2">&quot;post[content]&quot;</span><span class="p">,</span> <span class="ss">:rows</span> <span class="o">=&gt;</span> <span class="s2">&quot;20&quot;</span><span class="p">}</span>
</span><span class='line'><span class="nc">.actions</span>
</span><span class='line'>  <span class="nt">%input</span><span class="nc">.btn.btn-primary</span><span class="p">{</span><span class="ss">:name</span> <span class="o">=&gt;</span> <span class="s2">&quot;commit&quot;</span><span class="p">,</span> <span class="ss">:type</span> <span class="o">=&gt;</span> <span class="s2">&quot;submit&quot;</span><span class="p">,</span> <span class="ss">:value</span> <span class="o">=&gt;</span> <span class="s2">&quot;Submit&quot;</span><span class="p">}</span>
</span><span class='line'>    <span class="nt">%a</span><span class="nc">.btn</span><span class="p">{</span><span class="s1">&#39;data-route&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;Post&#39;</span><span class="p">}</span> Cancel
</span></code></pre></td></tr></table></div></figure>


<p>Finally, the form partial has some logic to make the validation errors show up and so on. We also see some of the conditionals, pretty neat.</p>

<p>Pause for a second. The basic CRUD app is done. Fastest time to this stage of any framework I&rsquo;ve looked at (I was timing productivity both in learning the frameworks from scratch and production of form crud). While figuring out how to do this took a much longer time, if you are following along I bet you got to this point under 30 minutes.</p>

<p>That&rsquo;s pretty quick!</p>

<p>Next time, associations.</p>

<p>PS &ndash; And if you want it to look pretty, here&rsquo;s the SASS I&rsquo;m using:</p>

<figure class='code'><figcaption><span>app/assets/stylesheets/main.css.scss </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
</pre></td><td class='code'><pre><code class='scss'><span class='line'><span class="c1">// Place all the styles related to the posts controller here.</span>
</span><span class='line'><span class="c1">// They will automatically be included in application.css.</span>
</span><span class='line'><span class="c1">// You can use Sass (SCSS) here: http://sass-lang.com/</span>
</span><span class='line'><span class="c1">// Set the correct sprite paths</span>
</span><span class='line'><span class="nv">$iconSpritePath</span><span class="o">:</span> <span class="nf">image-path</span><span class="p">(</span><span class="s1">&#39;</span><span class="s2">glyphicons-halflings.png&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nv">$iconWhiteSpritePath</span><span class="o">:</span> <span class="nf">image-path</span><span class="p">(</span><span class="s1">&#39;</span><span class="s2">glyphicons-halflings-white.png&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="c1">//$navbarBackground: #555;</span>
</span><span class='line'><span class="c1">//$navbarBackgroundHighlight: #888;</span>
</span><span class='line'><span class="c1">//$navbarText: #eee;</span>
</span><span class='line'><span class="c1">//$navbarLinkColor: #eee;</span>
</span><span class='line'>
</span><span class='line'><span class="k">@import</span> <span class="s2">&quot;bootstrap&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nt">body</span> <span class="p">{</span> <span class="na">padding-top</span><span class="o">:</span> <span class="mi">40</span><span class="kt">px</span><span class="p">;</span> <span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="k">@import</span> <span class="s2">&quot;bootstrap-responsive&quot;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.navbar</span> <span class="nc">.brand</span> <span class="p">{</span>
</span><span class='line'>  <span class="c1">//color: #FAFFB8;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="c1">// Place all the styles related to the memories controller here.</span>
</span><span class='line'><span class="c1">// They will automatically be included in application.css.</span>
</span><span class='line'><span class="c1">// You can use Sass (SCSS) here: http://sass-lang.com/</span>
</span><span class='line'>
</span><span class='line'><span class="nt">h1</span><span class="o">,</span> <span class="nt">h2</span><span class="o">,</span> <span class="nt">h3</span><span class="o">,</span> <span class="nt">h4</span><span class="o">,</span> <span class="nt">h5</span><span class="o">,</span> <span class="nt">h6</span><span class="o">,</span> <span class="nt">p</span><span class="o">,</span> <span class="nt">div</span> <span class="p">{</span>
</span><span class='line'>  <span class="na">font-family</span><span class="o">:</span> <span class="n">museo-slab</span><span class="o">,</span> <span class="no">sans-serif</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nt">html</span><span class="o">,</span> <span class="nt">body</span> <span class="p">{</span>
</span><span class='line'>  <span class="na">background-color</span><span class="o">:</span> <span class="mh">#eee</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.container</span> <span class="o">&gt;</span> <span class="nt">footer</span> <span class="nt">p</span> <span class="p">{</span>
</span><span class='line'>  <span class="na">text-align</span><span class="o">:</span> <span class="no">center</span><span class="p">;</span> <span class="cm">/* center align it with the container */</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/* The white background content wrapper */</span>
</span><span class='line'><span class="nc">.content</span> <span class="p">{</span>
</span><span class='line'>  <span class="na">background-color</span><span class="o">:</span> <span class="mh">#fff</span><span class="p">;</span>
</span><span class='line'>  <span class="na">padding</span><span class="o">:</span> <span class="mi">20</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'>  <span class="na">margin</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">-20</span><span class="kt">px</span><span class="p">;</span> <span class="cm">/* negative indent the amount of the padding to maintain the grid system */</span>
</span><span class='line'>  <span class="na">-webkit-border-radius</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">6</span><span class="kt">px</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'>     <span class="na">-moz-border-radius</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">6</span><span class="kt">px</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'>          <span class="na">border-radius</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">0</span> <span class="mi">6</span><span class="kt">px</span> <span class="mi">6</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'>  <span class="na">-webkit-box-shadow</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">2</span><span class="kt">px</span> <span class="nf">rgba</span><span class="p">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,.</span><span class="mi">15</span><span class="p">);</span>
</span><span class='line'>     <span class="na">-moz-box-shadow</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">2</span><span class="kt">px</span> <span class="nf">rgba</span><span class="p">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,.</span><span class="mi">15</span><span class="p">);</span>
</span><span class='line'>          <span class="na">box-shadow</span><span class="o">:</span> <span class="mi">0</span> <span class="mi">1</span><span class="kt">px</span> <span class="mi">2</span><span class="kt">px</span> <span class="nf">rgba</span><span class="p">(</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,</span><span class="mi">0</span><span class="o">,.</span><span class="mi">15</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nc">.notice</span> <span class="p">{</span>
</span><span class='line'>    <span class="na">border</span><span class="o">:</span> <span class="mh">#444447</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span><span class="p">;</span>
</span><span class='line'>    <span class="na">padding</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'>    <span class="na">margin</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nn">#error-explanation</span> <span class="nt">ul</span> <span class="p">{</span>
</span><span class='line'>    <span class="na">margin</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">15</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nc">.error</span> <span class="p">{</span>
</span><span class='line'>    <span class="na">border</span><span class="o">:</span> <span class="mi">1</span><span class="kt">px</span> <span class="no">solid</span> <span class="mh">#c87872</span><span class="p">;</span>
</span><span class='line'>    <span class="na">padding</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span><span class="p">;</span>
</span><span class='line'>    <span class="na">margin</span><span class="o">:</span> <span class="mi">10</span><span class="kt">px</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="nn">#posts</span> <span class="p">{</span>
</span><span class='line'>  <span class="na">list-style-type</span><span class="o">:</span> <span class="no">none</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js and Rails Part 2, Batman Install]]></title>
    <link href="http://zhubert.github.io/blog/2012/05/12/batman-dot-js-and-rails-part-2/"/>
    <updated>2012-05-12T10:53:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/05/12/batman-dot-js-and-rails-part-2</id>
    <content type="html"><![CDATA[<p>So, <a href="http://www.zhubert.com/blog/2012/05/12/batman-dot-js-and-rails-part-1/">Rails is ready</a>, let&rsquo;s get Batman talking.  It turns out to be really easy.</p>

<p>First let&rsquo;s run the generator that comes with <code>batman-rails</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rails g batman:install</span></code></pre></td></tr></table></div></figure>


<p> <!-- more --></p>

<p>I&rsquo;m not a fan of having things directly under <code>javascripts</code> so I moved the created directory structure so things are like: (copying a fresh Batman 0.9.0 install into place under lib):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>app/assets/javascripts
</span><span class='line'>--&gt; batman/
</span><span class='line'>----&gt; [controllers/,helpers/,models/,views/]
</span><span class='line'>--&gt; lib/
</span><span class='line'>----&gt; [batman.js,batman.jquery.js,batman.rails.js]
</span></code></pre></td></tr></table></div></figure>


<p>Taking a peek at your <code>application.js.coffee</code> (yes I changed the extension) you see a very simple loading of the Batman app:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>#= require jquery
</span><span class='line'>#= require jquery_ujs
</span><span class='line'>#= require bootstrap
</span><span class='line'>
</span><span class='line'># Batman.js and its adapters
</span><span class='line'>#= require ./lib/batman.js
</span><span class='line'>#= require ./lib/batman.jquery.js
</span><span class='line'>#= require ./lib/batman.rails.js
</span><span class='line'>#= require ./lib/batman.paginator.js
</span><span class='line'>
</span><span class='line'>#= require batman_rails_demo
</span><span class='line'>
</span><span class='line'>#= require_tree ./batman/models
</span><span class='line'>#= require_tree ./batman/controllers
</span><span class='line'>#= require_tree ./batman/helpers
</span><span class='line'>
</span><span class='line'>#= require_tree .
</span><span class='line'># Run the Batman app
</span><span class='line'>$(document).ready -&gt;
</span><span class='line'>  BatmanRailsDemo.run()</span></code></pre></td></tr></table></div></figure>


<p>The astute will notice I added <code>#= bootstrap</code> and that Batman has provisions for Rails directly! Woo hoo, that&rsquo;s encouraging.</p>

<p>So now let&rsquo;s take a peek at the main Batman Application file:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman_rails_demo.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nb">window</span><span class="p">.</span><span class="nv">BatmanRailsDemo = </span><span class="k">class</span> <span class="nx">BatmanRailsDemo</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">App</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@title = </span><span class="s">&quot;Batman Rails Demo&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># 0.8.0 changed to this syntax</span>
</span><span class='line'>  <span class="nv">Batman.ViewStore.prefix = </span><span class="s">&#39;assets/batman/views&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@navLinks: </span><span class="p">[</span>
</span><span class='line'>    <span class="p">{</span><span class="nv">href: </span><span class="s">&quot;/</span><span class="err">#</span><span class="s">!/posts/&quot;</span><span class="p">,</span> <span class="nv">controller: </span><span class="s">&quot;posts&quot;</span><span class="p">,</span> <span class="nv">text: </span><span class="s">&quot;Posts&quot;</span><span class="p">},</span>
</span><span class='line'>  <span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># routing...</span>
</span><span class='line'>  <span class="nx">@resources</span> <span class="s">&#39;posts&#39;</span>
</span><span class='line'>  <span class="nx">@root</span> <span class="s">&#39;posts&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># here and below is automatically generated</span>
</span><span class='line'>  <span class="nx">@</span><span class="kc">on</span> <span class="s">&#39;run&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">console</span><span class="o">?</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;Running ....&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">@</span><span class="kc">on</span> <span class="s">&#39;ready&#39;</span><span class="p">,</span> <span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">console</span><span class="o">?</span><span class="p">.</span><span class="nx">log</span> <span class="s">&quot;BatmanRailsDemo ready for use.&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># flash is a simple object</span>
</span><span class='line'>  <span class="vi">@flash: </span><span class="nx">Batman</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># when you set an message, it auto-expires</span>
</span><span class='line'>  <span class="nx">@flash</span><span class="p">.</span><span class="nx">accessor</span>
</span><span class='line'>    <span class="nv">get: </span><span class="nf">(key) -&gt;</span> <span class="nx">@</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span>
</span><span class='line'>    <span class="nv">set: </span><span class="nf">(key, value) -&gt;</span>
</span><span class='line'>      <span class="nx">@</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nx">value</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">value</span> <span class="o">isnt</span> <span class="s">&#39;&#39;</span>
</span><span class='line'>        <span class="nx">setTimeout</span> <span class="o">=&gt;</span>
</span><span class='line'>          <span class="nx">@set</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="s">&#39;&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="p">,</span> <span class="mi">2000</span>
</span><span class='line'>      <span class="nx">value</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@flashSuccess: </span><span class="nf">(message) -&gt;</span> <span class="nx">@set</span> <span class="s">&#39;flash.success&#39;</span><span class="p">,</span> <span class="nx">message</span>
</span><span class='line'>  <span class="vi">@flashError: </span><span class="nf">(message) -&gt;</span>  <span class="nx">@set</span> <span class="s">&#39;flash.error&#39;</span><span class="p">,</span> <span class="nx">message</span>
</span></code></pre></td></tr></table></div></figure>


<p>Most of that is boilerplate, but we can see that I added some Nav bits and that routing takes TWO LINES! It even looks like a Coffee-ized Rails. Neato. The ViewStore bit is really important. If you get errors from Batman saying it can&rsquo;t find your views, it is either that line or missing asset pipeline gems.</p>

<p>The model:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/models/post.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">Post</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Model</span>
</span><span class='line'>  <span class="vi">@resourceName: </span><span class="s">&#39;post&#39;</span>
</span><span class='line'>  <span class="vi">@storageKey: </span><span class="s">&#39;posts&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">@persist</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">RailsStorage</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># fields</span>
</span><span class='line'>  <span class="nx">@encode</span> <span class="s">&quot;title&quot;</span><span class="p">,</span> <span class="s">&quot;content&quot;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># validations</span>
</span><span class='line'>  <span class="nx">@validate</span> <span class="s">&quot;title&quot;</span><span class="p">,</span> <span class="nv">presence: </span><span class="kc">true</span>
</span><span class='line'>  <span class="nx">@validate</span> <span class="s">&quot;content&quot;</span><span class="p">,</span> <span class="nv">presence: </span><span class="kc">true</span>
</span></code></pre></td></tr></table></div></figure>


<p>RailsStorage! It happily passes serverside validation errors to our client, that&rsquo;s cool.  Validation syntax is terse as are field definitions.</p>

<p>The controller:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/batman/controllers/posts_controller.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="k">class</span> <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">PostsController</span> <span class="k">extends</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">Controller</span>
</span><span class='line'>  <span class="nv">routingKey: </span><span class="s">&#39;posts&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">index: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">Post</span><span class="p">.</span><span class="nx">load</span> <span class="p">(</span><span class="nx">err</span><span class="p">,</span><span class="nx">results</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">@set</span> <span class="s">&#39;posts&#39;</span><span class="p">,</span> <span class="nx">results</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">show: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">@set</span> <span class="s">&#39;post&#39;</span><span class="p">,</span> <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">Post</span><span class="p">.</span><span class="nx">find</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="nf">(err) -&gt;</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">@render</span> <span class="nv">source: </span><span class="s">&#39;posts/show&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">new</span><span class="o">:</span> <span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">@set</span> <span class="s">&#39;post&#39;</span><span class="p">,</span> <span class="k">new</span> <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">Post</span><span class="p">()</span>
</span><span class='line'>    <span class="vi">@form = </span><span class="nx">@render</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">create: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;post&#39;</span><span class="p">).</span><span class="nx">save</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s">&#39;#new_post&#39;</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s">&#39;disabled&#39;</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">ErrorsSet</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">flashSuccess</span> <span class="s">&quot;</span><span class="si">#{</span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;post.title&#39;</span><span class="p">)</span><span class="si">}</span><span class="s"> created successfully!&quot;</span>
</span><span class='line'>        <span class="nx">@redirect</span> <span class="s">&#39;/posts&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">edit: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">@set</span> <span class="s">&#39;post&#39;</span><span class="p">,</span> <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">Post</span><span class="p">.</span><span class="nx">find</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">params</span><span class="p">.</span><span class="nx">id</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span> <span class="nf">(err) -&gt;</span>
</span><span class='line'>      <span class="k">throw</span> <span class="nx">err</span> <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>    <span class="vi">@form = </span><span class="nx">@render</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">update: </span><span class="nf">(params) -&gt;</span>
</span><span class='line'>    <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;post&#39;</span><span class="p">).</span><span class="nx">save</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">$</span><span class="p">(</span><span class="s">&#39;#edit_post&#39;</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s">&#39;disabled&#39;</span><span class="p">,</span> <span class="kc">false</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>      <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">ErrorsSet</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">flashSuccess</span> <span class="s">&quot;</span><span class="si">#{</span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;post.title&#39;</span><span class="p">)</span><span class="si">}</span><span class="s"> updated successfully!&quot;</span>
</span><span class='line'>        <span class="nx">@redirect</span> <span class="s">&#39;/posts&#39;</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># not routable, an event</span>
</span><span class='line'>  <span class="nv">destroy: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;post&#39;</span><span class="p">).</span><span class="nx">destroy</span> <span class="p">(</span><span class="nx">err</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">err</span>
</span><span class='line'>        <span class="k">throw</span> <span class="nx">err</span> <span class="nx">unless</span> <span class="nx">err</span> <span class="k">instanceof</span> <span class="nx">Batman</span><span class="p">.</span><span class="nx">ErrorsSet</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">BatmanRailsDemo</span><span class="p">.</span><span class="nx">flashSuccess</span> <span class="s">&quot;Removed successfully!&quot;</span>
</span><span class='line'>        <span class="nx">@redirect</span> <span class="s">&#39;/posts&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>That is structured exactly like a resourceful controller in Rails (although destroy isn&rsquo;t routable). Convenient. A Rails developer should look at this as the MVC they already know.</p>

<p>So good so far. Next time&hellip;views.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Batman.js and Rails Part 1, Server Side]]></title>
    <link href="http://zhubert.github.io/blog/2012/05/12/batman-dot-js-and-rails-part-1/"/>
    <updated>2012-05-12T10:52:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/05/12/batman-dot-js-and-rails-part-1</id>
    <content type="html"><![CDATA[<p>Similar to my last few posts, I&rsquo;d like to explore <a href="http://www.batmanjs.org">Batman.js</a> through building a simple CRUD app. Specifically my requirements are:</p>

<ul>
<li>Simple form CRUD</li>
<li>Routing of resources &ndash; nested, with nav, pagination</li>
<li>Associations &ndash; has_many, belongs_to</li>
<li>Rails idiom and integration &ndash; shouldn&rsquo;t be an impedance mismatch</li>
<li>Data binding &ndash; views change automatically when data does</li>
<li>View Composition &ndash; weak, strong&hellip;just get it done</li>
<li>No Framework Poison Pills &ndash; that would be bugs and things that would jeopardize a production app</li>
<li>HAML/Coffeescript Friendly</li>
</ul>


<p>This first post is going to be really similar to <a href="http://www.zhubert.com/blog/2012/04/26/ember-dot-js-and-rails-part-1/">getting ready for Ember</a>, but has a few differences now that I&rsquo;ve carried the Batman implementation all the way through and some master branches have changed (life on the edge). Here we go&hellip;</p>

<p> <!-- more --></p>

<p>Start a new rails app (Rails 3.2.3):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rails new batman-rails-demo</span></code></pre></td></tr></table></div></figure>


<p>And add the following to the Gemfile:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class=''><span class='line'># AMS, no longer requires a scope, woot!
</span><span class='line'>gem "active_model_serializers", :git =&gt; "git://github.com/josevalim/active_model_serializers.git"
</span><span class='line'>
</span><span class='line'># shipping 0.8.0 (latest is 0.9.0), so just getting this for generators
</span><span class='line'>gem 'batman-rails', git: 'git://github.com/Shopify/batman-rails.git'
</span><span class='line'>
</span><span class='line'># for sanity
</span><span class='line'>gem 'thin'
</span><span class='line'>gem 'quiet_assets'
</span><span class='line'>gem 'bootstrap-sass', '~&gt; 2.0.1', group: [:assets]
</span><span class='line'>gem 'haml-rails'
</span><span class='line'>gem 'haml_assets'
</span><span class='line'>gem 'ejs'
</span><span class='line'>
</span><span class='line'># for faking data for dev
</span><span class='line'>gem 'ffaker', group: [:development, :test]</span></code></pre></td></tr></table></div></figure>


<p>And rebundle&hellip;</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ bundle update</span></code></pre></td></tr></table></div></figure>


<p>Now let&rsquo;s make our single resource and a serializer (serializer now made automatically!):</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rails g resource post title:string content:string</span></code></pre></td></tr></table></div></figure>


<p>Oddly, the serializer references some <code>ApplicationSerializer</code> which doesn&rsquo;t exist at the time of writing, so change that to:</p>

<figure class='code'><figcaption><span>app/serializers/post_serializer.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">PostSerializer</span> <span class="o">&lt;</span> <span class="no">ActiveModel</span><span class="o">::</span><span class="no">Serializer</span>
</span><span class='line'>  <span class="n">attributes</span> <span class="ss">:title</span><span class="p">,</span> <span class="ss">:content</span><span class="p">,</span> <span class="ss">:id</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And put the basics into our posts_controller:</p>

<figure class='code'><figcaption><span>app/controllers/posts_controller.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">PostsController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</span><span class='line'>  <span class="n">respond_to</span> <span class="ss">:json</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">index</span>
</span><span class='line'>    <span class="n">respond_with</span> <span class="no">Post</span><span class="o">.</span><span class="n">all</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">show</span>
</span><span class='line'>    <span class="n">respond_with</span> <span class="no">Post</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># for validation, can&#39;t use responders (batman expects errors to not have a root)</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">create</span>
</span><span class='line'>    <span class="vi">@post</span> <span class="o">=</span> <span class="no">Post</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:post</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>      <span class="k">if</span> <span class="vi">@post</span><span class="o">.</span><span class="n">save</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@post</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@post</span><span class="o">.</span><span class="n">errors</span><span class="p">,</span> <span class="ss">:status</span> <span class="o">=&gt;</span> <span class="ss">:unprocessable_entity</span><span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># for validation, can&#39;t use responders (batman expects errors to not have a root)</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">update</span>
</span><span class='line'>    <span class="vi">@post</span> <span class="o">=</span> <span class="no">Post</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>    <span class="n">respond_to</span> <span class="k">do</span> <span class="o">|</span><span class="nb">format</span><span class="o">|</span>
</span><span class='line'>      <span class="k">if</span> <span class="vi">@post</span><span class="o">.</span><span class="n">update_attributes</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:post</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@post</span> <span class="p">}</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nb">format</span><span class="o">.</span><span class="n">json</span> <span class="p">{</span> <span class="n">render</span> <span class="ss">:json</span> <span class="o">=&gt;</span> <span class="vi">@post</span><span class="o">.</span><span class="n">errors</span><span class="p">,</span> <span class="ss">:status</span> <span class="o">=&gt;</span> <span class="ss">:unprocessable_entity</span><span class="p">}</span>
</span><span class='line'>      <span class="k">end</span>
</span><span class='line'>    <span class="k">end</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># batman can handle Rails 3 respond for this action</span>
</span><span class='line'>  <span class="k">def</span> <span class="nf">destroy</span>
</span><span class='line'>    <span class="n">respond_with</span> <span class="no">Post</span><span class="o">.</span><span class="n">destroy</span><span class="p">(</span><span class="n">params</span><span class="o">[</span><span class="ss">:id</span><span class="o">]</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>And get our database up to speed&hellip;</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake db:create
</span><span class='line'>$ rake db:migrate</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s put some dummy data into seeds.rb:</p>

<figure class='code'><figcaption><span>db/seeds.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="n">foo</span> <span class="o">=</span> <span class="mi">0</span>
</span><span class='line'><span class="mi">25</span><span class="o">.</span><span class="n">times</span> <span class="k">do</span>
</span><span class='line'>  <span class="nb">sleep</span> <span class="mi">1</span> <span class="c1"># so we can have unique timestamps</span>
</span><span class='line'>  <span class="no">Post</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="ss">:title</span> <span class="o">=&gt;</span> <span class="s2">&quot;Post </span><span class="si">#{</span><span class="n">foo</span><span class="o">.</span><span class="n">to_i</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">,</span> <span class="ss">:content</span> <span class="o">=&gt;</span> <span class="s2">&quot;</span><span class="si">#{</span><span class="no">Faker</span><span class="o">::</span><span class="no">Lorem</span><span class="o">.</span><span class="n">paragraph</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
</span><span class='line'>  <span class="n">foo</span> <span class="o">=</span> <span class="n">foo</span> <span class="o">+</span> <span class="mi">1</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>


<p>Seeding will take 25 seconds&hellip;</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rake db:seed</span></code></pre></td></tr></table></div></figure>


<p>Running the server and calling the API we see some serialized posts. Woot!</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rails server
</span><span class='line'>$ curl localhost:3000/posts.json # from another window
</span><span class='line'>{"posts":[{"title":"Post 0","content":"Dolore suscipit et et consectetur necessitatibus sapiente consequatur. Ut laboriosam animi ducimus veniam delectus labore. Earum minima non architecto consequuntur minus. Delectus omnis saepe illum et quas consequatur. Consequatur vitae provident cum eaque dolor tenetur. Qui consequatur delectus odio aliquam tenetur ut."}...</span></code></pre></td></tr></table></div></figure>


<p>Some routing changes in <code>config/routes.rb</code>:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>BatmanRailsDemo::Application.routes.draw do
</span><span class='line'>  resources :posts
</span><span class='line'>  root to: 'main#index'
</span><span class='line'>end</span></code></pre></td></tr></table></div></figure>


<p>Make a landing page action to host the app:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>$ rails g controller main index</span></code></pre></td></tr></table></div></figure>


<p>Remove <code>public/index.html</code>, empty out <code>main/index.html</code> and if you&rsquo;re HAML crazy like most folks I know, change your <code>application.html.haml</code> like so (oooh, the hints of Batman creep in!):</p>

<figure class='code'><figcaption><span>app/views/layouts/application.html.haml </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
</pre></td><td class='code'><pre><code class='haml'><span class='line'><span class="nn">!!!</span>
</span><span class='line'><span class="nt">%html</span>
</span><span class='line'>  <span class="nt">%head</span>
</span><span class='line'>    <span class="nt">%meta</span><span class="p">{</span><span class="ss">:charset</span> <span class="o">=&gt;</span> <span class="s2">&quot;utf-8&quot;</span><span class="p">}</span>
</span><span class='line'>      <span class="nt">%title</span> CRUD Demo
</span><span class='line'>      <span class="p">=</span> <span class="n">stylesheet_link_tag</span> <span class="s1">&#39;application&#39;</span>
</span><span class='line'>      <span class="p">=</span> <span class="n">javascript_include_tag</span> <span class="s2">&quot;application&quot;</span>
</span><span class='line'>      <span class="p">=</span> <span class="n">csrf_meta_tags</span>
</span><span class='line'>  <span class="nt">%body</span>
</span><span class='line'>    <span class="nc">.navbar.navbar-fixed-top</span>
</span><span class='line'>      <span class="nc">.navbar-inner</span>
</span><span class='line'>        <span class="nc">.container</span>
</span><span class='line'>          <span class="nt">%a</span><span class="nc">.brand</span><span class="p">{</span><span class="ss">:href</span> <span class="o">=&gt;</span> <span class="s1">&#39;/&#39;</span><span class="p">}</span>
</span><span class='line'>            CRUD
</span><span class='line'>          <span class="nt">%ul</span><span class="nc">.nav</span>
</span><span class='line'>            <span class="nt">%li</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;foreach-nav&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;window.BatmanRailsDemo.navLinks&quot;</span><span class="p">,</span> <span class="s2">&quot;addclass-active&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;window.BatmanRailsDemo.currentRoute.controller | matches nav.controller&quot;</span><span class="p">}</span>}
</span><span class='line'>              <span class="nt">%a</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;nav.text&quot;</span><span class="p">,</span> <span class="s2">&quot;bind-href&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;nav.href&quot;</span><span class="p">}</span>}
</span><span class='line'>    <span class="nf">#main</span><span class="nc">.container</span>
</span><span class='line'>      <span class="nc">.content</span>
</span><span class='line'>        <span class="nt">%p</span><span class="nf">#flashnotice</span><span class="nc">.alert.alert-success</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;showif&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;window.BatmanRailsDemo.flash.success.length&quot;</span><span class="p">}</span>}
</span><span class='line'>          <span class="nt">%a</span><span class="nc">.close</span><span class="p">{</span><span class="ss">:href</span> <span class="o">=&gt;</span> <span class="s2">&quot;#&quot;</span><span class="p">,</span> <span class="ss">:onclick</span> <span class="o">=&gt;</span> <span class="s2">&quot;$(&#39;#flashnotice&#39;).hide(); return false&quot;</span><span class="p">}</span> ×
</span><span class='line'>          <span class="nt">%span</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;window.BatmanRailsDemo.flash.success&quot;</span><span class="p">}</span>}
</span><span class='line'>        <span class="nt">%p</span><span class="nf">#flashwarning</span><span class="nc">.alert.alert-error</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;showif&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;window.BatmanRailsDemo.flash.error.length&quot;</span><span class="p">}</span>}
</span><span class='line'>          <span class="nt">%a</span><span class="nc">.close</span><span class="p">{</span><span class="ss">:href</span> <span class="o">=&gt;</span> <span class="s2">&quot;#&quot;</span><span class="p">,</span> <span class="ss">:onclick</span> <span class="o">=&gt;</span> <span class="s2">&quot;$(&#39;#flashwarning&#39;).hide(); return false&quot;</span><span class="p">}</span> ×
</span><span class='line'>          <span class="nt">%span</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;bind&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;window.BatmanRailsDemo.flash.error&quot;</span><span class="p">}</span>}
</span><span class='line'>        <span class="nt">%div</span><span class="p">{</span><span class="ss">:data</span> <span class="o">=&gt;</span> <span class="p">{</span><span class="s2">&quot;yield&quot;</span> <span class="o">=&gt;</span> <span class="s2">&quot;main&quot;</span><span class="p">}</span>}
</span><span class='line'>        <span class="nt">%footer</span>
</span><span class='line'>          <span class="nt">%p</span>
</span><span class='line'>            &amp;copy; zhubert <span class="si">#{</span><span class="no">Time</span><span class="o">.</span><span class="n">now</span><span class="o">.</span><span class="n">year</span><span class="si">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>So now Rails is ready to play nice with Batman. Time for the fun!</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ember.js and Rails Part 5, Naive Real-time]]></title>
    <link href="http://zhubert.github.io/blog/2012/05/11/ember-dot-js-and-rails-part-5/"/>
    <updated>2012-05-11T08:17:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/05/11/ember-dot-js-and-rails-part-5</id>
    <content type="html"><![CDATA[<p>Since I&rsquo;m moving on from Ember for now, here&rsquo;s one last recipe to almost get some real-time single model functionality with Pusher and Ember.</p>

<p> <!-- more --></p>

<p>With Rails, we do our usual Pusher stuff (done this in Backbone recently as well)</p>

<figure class='code'><figcaption><span>Gemfile </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='ruby'><span class='line'><span class="n">gem</span> <span class="s1">&#39;pusher&#39;</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>config/application.rb  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="n">config</span><span class="o">.</span><span class="n">active_record</span><span class="o">.</span><span class="n">observers</span> <span class="o">=</span> <span class="ss">:pusher_observer</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>app/models/pusher_observer.rb  </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="k">class</span> <span class="nc">PusherObserver</span> <span class="o">&lt;</span> <span class="no">ActiveRecord</span><span class="o">::</span><span class="no">Observer</span>
</span><span class='line'>  <span class="n">observe</span> <span class="ss">:post</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">after_create</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="n">channel_name</span> <span class="o">=</span> <span class="n">pusher_channel_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="no">Pusher</span><span class="o">[</span><span class="n">channel_name</span><span class="o">].</span><span class="n">trigger</span><span class="p">(</span><span class="s1">&#39;created&#39;</span><span class="p">,</span><span class="n">model</span><span class="o">.</span><span class="n">to_json</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">after_update</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="n">channel_name</span> <span class="o">=</span> <span class="n">pusher_channel_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="no">Pusher</span><span class="o">[</span><span class="n">channel_name</span><span class="o">].</span><span class="n">trigger</span><span class="p">(</span><span class="s1">&#39;updated&#39;</span><span class="p">,</span><span class="n">model</span><span class="o">.</span><span class="n">to_json</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">before_destroy</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="n">channel_name</span> <span class="o">=</span> <span class="n">pusher_channel_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="no">Pusher</span><span class="o">[</span><span class="n">channel_name</span><span class="o">].</span><span class="n">trigger</span><span class="p">(</span><span class="s1">&#39;destroyed&#39;</span><span class="p">,</span><span class="n">model</span><span class="o">.</span><span class="n">to_json</span><span class="p">)</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">def</span> <span class="nf">pusher_channel_name</span><span class="p">(</span><span class="n">model</span><span class="p">)</span>
</span><span class='line'>    <span class="n">channel_name</span> <span class="o">=</span> <span class="n">model</span><span class="o">.</span><span class="n">class</span><span class="o">.</span><span class="n">table_name</span>
</span><span class='line'>  <span class="k">end</span>
</span><span class='line'><span class="k">end</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>config/initializers/pusher.rb </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='rb'><span class='line'><span class="no">Pusher</span><span class="o">.</span><span class="n">app_id</span> <span class="o">=</span> <span class="s1">&#39;12345&#39;</span>
</span><span class='line'><span class="no">Pusher</span><span class="o">.</span><span class="n">key</span>    <span class="o">=</span> <span class="s1">&#39;12345&#39;</span>
</span><span class='line'><span class="no">Pusher</span><span class="o">.</span><span class="n">secret</span> <span class="o">=</span> <span class="s1">&#39;12345&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Then on the Ember Side, add the minified pusher JS to <code>ember/lib/</code> and require it:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/ember/lib/application.js </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">//= require ember/lib/pusher.min.js</span>
</span><span class='line'><span class="c1">//= require ember/lib/emberpusher.js</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>app/assets/javascripts/ember/lib/app.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.pusher = </span><span class="k">new</span> <span class="nx">Pusher</span><span class="p">(</span><span class="s">&quot;abc282882&quot;</span><span class="p">)</span> <span class="c1"># replace with app_key</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>app/assets/javascripts/ember/lib/emberpusher.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="p">(</span> <span class="o">-&gt;</span>
</span><span class='line'>  <span class="nv">Emberpusher = </span><span class="nf">(channel, store, model) -&gt;</span>
</span><span class='line'>    <span class="vi">@channel = </span><span class="nx">channel</span>
</span><span class='line'>    <span class="vi">@store = </span><span class="nx">store</span>
</span><span class='line'>    <span class="vi">@model = </span><span class="nx">model</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">@channel</span><span class="p">.</span><span class="nx">bind</span> <span class="s">&quot;created&quot;</span><span class="p">,</span> <span class="p">(</span><span class="nx">pushed_model</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">console</span><span class="o">?</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s">&#39;created&#39;</span> <span class="o">+</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">pushed_model</span><span class="p">))</span>
</span><span class='line'>      <span class="nv">foo = </span><span class="nx">@store</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">@model</span><span class="p">,</span><span class="nx">pushed_model</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">stateManager</span><span class="o">?</span><span class="p">.</span><span class="nx">currentState</span><span class="o">?</span><span class="p">.</span><span class="nx">name</span> <span class="o">==</span> <span class="s">&#39;inFlight&#39;</span>
</span><span class='line'>        <span class="c1"># do nothing, same process created it</span>
</span><span class='line'>      <span class="k">else</span> <span class="k">if</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="nx">foo</span><span class="p">.</span><span class="nx">setProperties</span><span class="p">(</span><span class="nx">pushed_model</span><span class="p">)</span>
</span><span class='line'>        <span class="nx">foo</span><span class="p">.</span><span class="nx">stateManager</span><span class="p">.</span><span class="nx">goToState</span><span class="p">(</span><span class="s">&#39;loaded&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">@store</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">@model</span><span class="p">,</span> <span class="nx">pushed_model</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">@channel</span><span class="p">.</span><span class="nx">bind</span> <span class="s">&quot;updated&quot;</span><span class="p">,</span> <span class="p">(</span><span class="nx">pushed_model</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">console</span><span class="o">?</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s">&#39;updated&#39;</span> <span class="o">+</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">pushed_model</span><span class="p">))</span>
</span><span class='line'>      <span class="nv">foo = </span><span class="nx">@store</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">@model</span><span class="p">,</span><span class="nx">pushed_model</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">)</span> <span class="o">and</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">stateManager</span><span class="o">?</span><span class="p">.</span><span class="nx">currentState</span><span class="o">?</span><span class="p">.</span><span class="nx">name</span> <span class="o">!=</span> <span class="s">&#39;inFlight&#39;</span>
</span><span class='line'>        <span class="nx">foo</span><span class="p">.</span><span class="nx">setProperties</span><span class="p">(</span><span class="nx">pushed_model</span><span class="p">)</span>
</span><span class='line'>        <span class="nx">foo</span><span class="p">.</span><span class="nx">stateManager</span><span class="p">.</span><span class="nx">goToState</span><span class="p">(</span><span class="s">&#39;loaded&#39;</span><span class="p">)</span>
</span><span class='line'>      <span class="k">else</span>
</span><span class='line'>        <span class="nx">@store</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">@model</span><span class="p">,</span> <span class="nx">pushed_model</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">@channel</span><span class="p">.</span><span class="nx">bind</span> <span class="s">&quot;destroyed&quot;</span><span class="p">,</span> <span class="p">(</span><span class="nx">pushed_model</span><span class="p">)</span> <span class="o">=&gt;</span>
</span><span class='line'>      <span class="nx">console</span><span class="o">?</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="s">&#39;destroyed&#39;</span> <span class="o">+</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">pushed_model</span><span class="p">))</span>
</span><span class='line'>      <span class="nv">foo = </span><span class="nx">@store</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">@model</span><span class="p">,</span><span class="nx">pushed_model</span><span class="p">.</span><span class="nx">id</span><span class="p">)</span>
</span><span class='line'>      <span class="k">if</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">stateManager</span><span class="o">?</span><span class="p">.</span><span class="nx">currentState</span><span class="o">?</span><span class="p">.</span><span class="nx">name</span> <span class="o">==</span> <span class="s">&#39;inFlight&#39;</span>
</span><span class='line'>        <span class="c1"># nothing</span>
</span><span class='line'>      <span class="k">else</span> <span class="k">if</span> <span class="nx">foo</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;id&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="nx">foo</span><span class="p">.</span><span class="nx">deleteRecord</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="vi">@Emberpusher = </span><span class="nx">Emberpusher</span>
</span><span class='line'><span class="p">).</span><span class="nx">call</span> <span class="k">this</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see, I&rsquo;m wrestling with the state machine implementation and I&rsquo;m not winning. All I wanted to do was say, here&rsquo;s a new authoritative state for this model, but sometimes it gets into a &lsquo;loading&rsquo; or &lsquo;loaded&rsquo; state which must be a race condition. Clearly, I shouldn&rsquo;t be messing with the state machine, or, I could spend more time reading the tests to get all the states and then correct the above but I can&rsquo;t justify more time spent.</p>

<p>Hopefully this helps someone else carry it across the line.</p>

<p>Credits
<a href="https://github.com/frodsan/supertodos">supertodos</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ember.js and Rails Part 4, Client Views]]></title>
    <link href="http://zhubert.github.io/blog/2012/05/07/ember-dot-js-and-rails-part-4/"/>
    <updated>2012-05-07T19:35:00-07:00</updated>
    <id>http://zhubert.github.io/blog/2012/05/07/ember-dot-js-and-rails-part-4</id>
    <content type="html"><![CDATA[<p>Last time we found some cool libraries to complement Ember.js by throwing a state machine at our routing dilemma. It was verbose, but it met our need.  With the router in place, we now need some views to respond to the router and render the templates (the logic-less presentation layer). Lots of code, on we go&hellip;</p>

<p> <!-- more --></p>

<p>So, views in Ember are not like views in Rails, to me they feel a lot more like a controller/presenter hybrid, perhaps like a ViewController in iOS. In fact, frequently while working on this form crud test app, I found I had a hard time deciding what logic should be in the view vs. being in the controller. This was compounded by quite a few examples on the web putting model access in the view, but I just couldn&rsquo;t abide doing that, so I&rsquo;ve tried to split things out as follows: template specific interactions in the views, and model interactions in the controller, but it didn&rsquo;t work well.</p>

<p>First up, we have to make a bunch of views that just point to the templates. In the future, these would have all sorts of interesting logic&hellip;but not so much now (showing a subset):</p>

<figure class='code'><figcaption><span>app/assets/javascripts/ember/views/main/home_view.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.MainHomeView = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">templateName: </span><span class="s">&quot;ember/templates/main/home&quot;</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>app/assets/javascripts/ember/views/main/home_view.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.MainLayoutView = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">templateName: </span><span class="s">&quot;ember/templates/main/layout&quot;</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>app/assets/javascripts/ember/views/posts/index_view.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.PostsIndexView = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">templateName: </span><span class="s">&quot;ember/templates/posts/index&quot;</span>
</span><span class='line'>  <span class="nv">postsBinding: </span><span class="s">&quot;App.postsController&quot;</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>app/assets/javascripts/ember/views/posts/layout_view.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.PostsLayoutView = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">templateName: </span><span class="s">&quot;ember/templates/posts/layout&quot;</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>One interesting thing in the index view, I wanted &ldquo;posts&rdquo; to come from <code>App.postsController</code> and be updated whenever it changes. If you are used to managing <code>@render</code> by hand in Backbone, the Binding funtionality in Ember will be a very welcome change.</p>

<p>The new/edit views are different.  As you see below, I tried to have the controller create the post on behalf of the view:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/ember/views/posts/new_view.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.PostsNewView = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">tagName: </span><span class="s">&quot;form&quot;</span>
</span><span class='line'>  <span class="nv">templateName: </span><span class="s">&quot;ember/templates/posts/new&quot;</span>
</span><span class='line'>  <span class="nv">classNames: </span><span class="p">[</span><span class="s">&quot;form-horizontal&quot;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># different than edit to enable validation for new objects</span>
</span><span class='line'>  <span class="nv">init: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@_super</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># called when added to the dom, like viewDidLoad</span>
</span><span class='line'>  <span class="nv">didInsertElement: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@_super</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">@$</span><span class="p">(</span><span class="s">&quot;input:first&quot;</span><span class="p">).</span><span class="nx">focus</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">cancelForm: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">App</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s">&#39;location&#39;</span><span class="p">,</span><span class="s">&#39;posts&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">submit: </span><span class="nf">(event) -&gt;</span>
</span><span class='line'>    <span class="nv">formTitle = </span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;title&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nv">formBody = </span><span class="nx">@get</span><span class="p">(</span><span class="s">&#39;body&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">App</span><span class="p">.</span><span class="nx">postsController</span><span class="p">.</span><span class="nx">createPost</span><span class="p">({</span><span class="nv">title: </span><span class="nx">formTitle</span><span class="p">,</span> <span class="nv">body: </span><span class="nx">formBody</span><span class="p">})</span>
</span><span class='line'>    <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">App</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s">&#39;location&#39;</span><span class="p">,</span><span class="s">&#39;posts&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>For reference, this edit view changes the model directly without a controller mediating. I ran out of time evaluating Ember so I was unable to refactor it like I did with the newView above:</p>

<figure class='code'><figcaption><span>app/assets/javascripts/ember/views/posts/edit_view.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.PostsEditView = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">View</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">tagName: </span><span class="s">&quot;form&quot;</span>
</span><span class='line'>  <span class="nv">templateName: </span><span class="s">&quot;ember/templates/posts/edit&quot;</span>
</span><span class='line'>  <span class="nv">classNames: </span><span class="p">[</span><span class="s">&quot;form-horizontal&quot;</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># called when added to the dom, like viewDidLoad</span>
</span><span class='line'>  <span class="nv">didInsertElement: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="vi">@transaction = </span><span class="nx">App</span><span class="p">.</span><span class="nx">store</span><span class="p">.</span><span class="nx">transaction</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">@transaction</span><span class="p">.</span><span class="nx">add</span> <span class="nx">@get</span><span class="p">(</span><span class="s">&quot;post&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">@_super</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">@$</span><span class="p">(</span><span class="s">&quot;input:first&quot;</span><span class="p">).</span><span class="nx">focus</span><span class="p">()</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">cancelForm: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@transaction</span><span class="p">.</span><span class="nx">rollback</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">App</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s">&#39;location&#39;</span><span class="p">,</span><span class="s">&#39;posts&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">submit: </span><span class="nf">(event) -&gt;</span>
</span><span class='line'>    <span class="nv">post = </span><span class="nx">@get</span><span class="p">(</span><span class="s">&quot;post&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="nv">validationErrors = </span><span class="nx">post</span><span class="p">.</span><span class="nx">validate</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">event</span><span class="p">.</span><span class="nx">preventDefault</span><span class="p">()</span>
</span><span class='line'>    <span class="k">if</span> <span class="nx">validationErrors</span> <span class="o">isnt</span> <span class="o">`</span><span class="kc">undefined</span><span class="o">`</span>
</span><span class='line'>      <span class="nx">App</span><span class="p">.</span><span class="nx">displayError</span> <span class="nx">validationErrors</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>      <span class="nx">@transaction</span><span class="p">.</span><span class="nx">commit</span><span class="p">()</span>
</span><span class='line'>      <span class="nx">App</span><span class="p">.</span><span class="nx">router</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="s">&#39;location&#39;</span><span class="p">,</span><span class="s">&#39;posts&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So, what about the controller?</p>

<figure class='code'><figcaption><span>app/assets/javascripts/ember/controllers/posts_controller.js.coffee </span></figcaption>
 <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
</pre></td><td class='code'><pre><code class='coffeescript'><span class='line'><span class="nv">App.postsController = </span><span class="nx">Ember</span><span class="p">.</span><span class="nx">ArrayController</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span>
</span><span class='line'>  <span class="nv">selectedPost: </span><span class="kc">null</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># controllers can persist state nicely</span>
</span><span class='line'>  <span class="nv">selectPost: </span><span class="nf">(postId) -&gt;</span>
</span><span class='line'>    <span class="nx">@set</span> <span class="s">&#39;selectedPost&#39;</span><span class="p">,</span> <span class="nx">App</span><span class="p">.</span><span class="nx">store</span><span class="p">.</span><span class="nx">find</span><span class="p">(</span><span class="nx">App</span><span class="p">.</span><span class="nx">Post</span><span class="p">,</span><span class="nx">postId</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="nv">findAll: </span><span class="o">-&gt;</span>
</span><span class='line'>    <span class="nx">@set</span> <span class="s">&#39;content&#39;</span><span class="p">,</span> <span class="nx">App</span><span class="p">.</span><span class="nx">store</span><span class="p">.</span><span class="nx">findAll</span><span class="p">(</span><span class="nx">App</span><span class="p">.</span><span class="nx">Post</span><span class="p">)</span> <span class="nx">unless</span> <span class="nx">@get</span><span class="p">(</span><span class="s">&#39;content&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1"># rather pointless transaction, also needs</span>
</span><span class='line'>  <span class="c1"># error handling</span>
</span><span class='line'>  <span class="nv">createPost: </span><span class="nf">(data) -&gt;</span>
</span><span class='line'>    <span class="vi">@transaction = </span><span class="nx">App</span><span class="p">.</span><span class="nx">store</span><span class="p">.</span><span class="nx">transaction</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">@transaction</span><span class="p">.</span><span class="nx">createRecord</span><span class="p">(</span><span class="nx">App</span><span class="p">.</span><span class="nx">Post</span><span class="p">,</span><span class="nx">data</span><span class="p">)</span>
</span><span class='line'>    <span class="nx">@transaction</span><span class="p">.</span><span class="nx">commit</span><span class="p">()</span>
</span><span class='line'><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>So with New, I get clean separation of concerns but no error handling. With the Edit pattern, I get the latter and not the former. Ugh. If I wanted to spend more time on this, it could be easily fixed by passing more state around, but this is already taking too long.</p>

<p>At around this time, I started hitting a different wall with Ember. It was a wall made of run loop issues, model state machine constraints, binding order dependencies, ember-data association problems, performance and latency challenges&hellip;it really felt like I just needed to wait a bit longer for the Ember core team to get it further down field.  They have all these items in the issue tracker on Github and are amazing Developers. I anticipate writing about Ember again and using it in a future project, but I need to build something now and the Devs have said it&rsquo;s Alpha.</p>

<p>Shortly after I ran into this hurdle with Ember, I got a text from my boss to take a look at <a href="http://batmanjs.org/">Batman.js</a>, and I&rsquo;m very happy he did. Batman is what I want today from a JS Framework&hellip;and it&rsquo;s almost 1.0! More next time.</p>

<p>You can see all the unfinished code for this app on <a href="https://github.com/zhubert/ember-rails-demo">github</a>.</p>
]]></content>
  </entry>
  
</feed>
