<?xml version="1.0" encoding="utf-8" standalone="no"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title><![CDATA[Raw Syntax]]></title>
  <link href="http://rawsyntax.com/atom.xml" rel="self"/>
  <link href="http://rawsyntax.com/"/>
  <updated>2017-07-19T12:22:26-05:00</updated>
  <id>http://rawsyntax.com/</id>
  <author>
    <name><![CDATA[Eric Himmelreich]]></name>
    <email><![CDATA[eric@rawsyntax.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
    <xhtml:meta content="noindex" name="robots" xmlns:xhtml="http://www.w3.org/1999/xhtml"/><entry>
      




<title type="html"><![CDATA[Elixir from a Ruby Point of View]]></title>
<link href="http://rawsyntax.com/blog/elixir-from-a-ruby-point-of-view/"/>
<updated>2017-07-18T20:53:21-05:00</updated>
<id>http://rawsyntax.com/blog/elixir-from-a-ruby-point-of-view</id>
<category term="elixir"/><category term="ruby"/>

      <content type="html"><![CDATA[<p>There has been plenty already written about Elixir, but I'm not yet convinced it is a silver bullet. However, I do think it is a useful tool when used in conjuction with existing ruby applications. In particular it can be used when speed or scaling ability is of critical importance.</p>

<p>What follows are a few examples of where Elixir could be used in a pre-existing ruby codebase.</p>

<h3>API</h3>

<p>Given an existing application such as an API written in Ruby, an Elixir backend can be proxied in and used for certain routes where speed or scaling is critical. An easy way to get started would be to replace a simple read only Ruby endpoint with Elixir.</p>

<p>Over time the entire Ruby based API could be replaced entirely with Elixir.</p>

<h3>Background Workers</h3>

<p>It is arguable that Rails' strength lies in its easy use of gems and wrangling the web tier with relative ease. Background workers aren't necessarily a reason to pick Rails over another framework. In some codebases background workers are separated entirely from the web tier application code.</p>

<p>One way to try out Elixir is having background jobs that get queued in Ruby, but then get executed by Elixir based workers. In fact, Elixir has a <a href="https://github.com/akira/exq">sidekiq compatible worker library</a>, which would allow each worker to be ported over to Elixir one by one, while existing Ruby workers peacefully coexist along side Elixir workers.</p>

<h3>Slides</h3>

<p>These two use cases allow for a trial of Elixir without having to build an entire application in it. I recently gave a talk on using Elixir from a Ruby point of view. The slides are below.</p>

<p><a href="https://slides.com/rawsyntax/elixir">Elixir with Ruby</a></p>

<iframe src="https://slides.com/rawsyntax/elixir/embed" width="576" height="420" scrolling="no" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>

]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[App Store Adventures]]></title>
<link href="http://rawsyntax.com/blog/app-store-adventures/"/>
<updated>2015-08-08T10:14:21-05:00</updated>
<id>http://rawsyntax.com/blog/app-store-adventures</id>
<category term="angularjs"/><category term="ionic"/><category term="programming"/>

      <content type="html"><![CDATA[<p><img src="http://rawsyntax.com/images/log-encounter.png" class ="center"/></p>

<p>Recently (in March) I took on a side project. My wife is nearing the end of her Family Medicine residency, however in talking with her I learned about a need for an app. The <a href="https://www.acgme.org/acgmeweb/tabid/132/ProgramandInstitutionalAccreditation/MedicalSpecialties/FamilyMedicine.aspx">ACGME</a> has requirements that residents in Family Medicine must have a certain number and type of patient visits completed to finish residency. For example one such requirement is performing 40 deliveries.</p>

<p>Where the app comes in is that it provides a simple way to log patient encounters and keep track of these metrics. After doing a quick search on the App Store and finding that such an app didn't already exist, I figured I could write one pretty easily. Though I don't have native app dev skills (Obj-C, Java) there are quite a few frameworks that allow developers to write JavaScript instead: <a href="http://www.appcelerator.com/product/">Appcelerator</a>, <a href="http://ionicframework.com/">Ionic Framework</a>, <a href="http://phonegap.com/">Phonegap</a> etc.</p>

<!--more-->


<h2>Building the App</h2>

<p>Ionic uses AngularJS and Cordova to handle building apps for phones. I chose Ionic because I'm already familiar with AngularJS. The actual app development was quite simple:</p>

<ul>
<li>setup a form in AngularJS</li>
<li>write form data to a sqlite database</li>
<li>query the database to display statistics</li>
<li>export the database to a CSV file and attach via email</li>
</ul>


<p>I only had to add a couple of cordova plugins, and write some straight forward JavaScript. The hardest part by far was signing up for the App Store and Google Play and building / submitting the app to each store.</p>

<p>Another user wrote a tutorial on how to <a href="http://forum.ionicframework.com/t/ionic-toturial-for-building-a-release-apk/15758">build and sign apps</a> for Android. This was extremely helpful since I'm less familiar with the Android submission process. To top it off I lost my app's keystore (which is required to make app updates) and had to dig through my Time Machine backups to find the file. I now have it more thoroughly backed up.</p>

<h2>App Design</h2>

<p>Once I reached a point where the app worked on my iPhone, I still needed an app icon. Instead of trying to make one myself I used <a href="http://99designs.com/">99designs</a>. After about a week of commenting back and forth with designers, I picked an app icon. What I actually received was a 1024x1024 PNG file.</p>

<p>Taking this file and creating all the various image sizes could have been a pain, but Ionic comes with the <code>ionic resources</code> <a href="http://ionicframework.com/docs/cli/icon-splashscreen.html">command</a>, which automates this process.</p>

<p>However it became clear that I didn't think this process entirely through, as I was missing a splash screen (for when the app is loading). I found a template and made a simple "Log Encounter" text splash screen. It is boring, but it gets the job done.</p>

<h2>Mission Accomplished</h2>

<p>So now the app is available for both Android and iOS:</p>

<ul>
<li><a href="https://play.google.com/store/apps/details?id=com.rawsyntax.logencounter">Log Encounter for Android</a></li>
<li><a href="https://itunes.apple.com/us/app/log-encounter/id980902840?mt=8">Log Encounter for iOS</a></li>
</ul>


<p>I've had a few sales (10?) on iOS and none on Android. Now that the app is done and works, figuring out how to increase sales is an entirely separate process. Mission accomplished but not finished. I've also received plenty of (unsolicited) email spam for app promotion services. I can only assume those services comb through the new app listings and email everyone.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Compatible .ruby-version with Rbenv Aliases]]></title>
<link href="http://rawsyntax.com/blog/compatible-ruby-version-with-rbenv-aliases/"/>
<updated>2015-06-21T22:11:36-05:00</updated>
<id>http://rawsyntax.com/blog/compatible-ruby-version-with-rbenv-aliases</id>
<category term="programming"/><category term="ruby"/>

      <content type="html"><![CDATA[<p>In the past I've worked on projects where the <code>.ruby-version</code> checked into git specifies a ruby version not recognized by rbenv. Typically this can happen when the ruby version is specified with patch version while rbenv omits it.</p>

<p>Consider a <code>.ruby-version</code> file containing <code>2.1.3p242</code>. This version is listed as <code>2.1.3</code> by rbenv (while RVM and others may list it differently), and it isn't recognized due to the patch version (though the version in rbenv is actually <code>2.1.3p242</code>).  There's a plugin called <a href="https://github.com/tpope/rbenv-aliases">rbenv-aliases</a> that addresses this problem.</p>

<p>You can install the plugin with the following commands:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>mkdir -p ~/.rbenv/plugins
</div><div class='line'>git clone git://github.com/tpope/rbenv-aliases.git <span class="se">\</span>
</div><div class='line'>  ~/.rbenv/plugins/rbenv-aliases
</div></pre></td></tr></table></div></figure></p>

<p>Then, running the command:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  bash'><pre><div class='line'>rbenv <span class="nb">alias </span>2.1.3p242 2.1.3
</div></pre></td></tr></table></div></figure></p>

<p>will cause rbenv to recognize <code>2.1.3p242</code> and set the ruby version to 2.1.3.</p>

<p>However, this plugin must be used with caution. You could say <code>rbenv alias 2.1.3 1.8.7</code>, which is a lie! The plugin comes with a command for removing any incorrect aliases <code>rbenv unalias 2.1.3</code>.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Comparing plist files on OSX]]></title>
<link href="http://rawsyntax.com/blog/comparing-plist-files-on-osx/"/>
<updated>2015-05-10T10:56:56-05:00</updated>
<id>http://rawsyntax.com/blog/comparing-plist-files-on-osx</id>
<category term="tools"/>

      <content type="html"><![CDATA[<p><img class="" src="http://rawsyntax.com/images/xcode-plist-export.png"></p>

<p>I recently had a problem with some of my keyboard shortcuts not working on OS X. I ended up moving the original plist (Property List) file, rebooting, and configuring the settings manually. This fixed the problem but left me wondering why the keyboard shortcut broke in the first place. Computers don't just break. There has to be a reason.</p>

<p>I tried to diff the two plist files and I got an unhelpful message similar to <code>binary files differ</code>. Having been on OS X a while, I know that plists can be saved as text or binary. In this case I simply used the <code>open</code> command to load the files into XCode, exported them as Property List XML, and then was able to diff them as normal text files.</p>

<h2>Why Binary?</h2>

<p>As an Emacs user, I was still confused as to why plists would ever be saved as binary. This just means I can't edit them with Emacs (out of the box anyway). Referring to the man page for plist it turns out the reason is performance:</p>

<blockquote><p>The property list programming interface allows you to convert hierarchically structured combinations of these basic types to and from two formats: standard XML and an optimized, opaque binary format.</p><footer><strong>man plist</strong> <cite><a href='https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man5/plist.5.html'>developer.apple.com/library/mac/&hellip;</a></cite></footer></blockquote>


<p>You can also use <code>plutil</code> to convert between binary and text. For example:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>plutil -convert xml1 com.apple.symbolichotkeys.plist</div></pre></td></tr></table></div></figure></p>

<p>Which converts the file to another format in place.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[RSpec Suite Runs Twice?]]></title>
<link href="http://rawsyntax.com/blog/rspec-suite-runs-twice/"/>
<updated>2015-01-19T08:09:45-06:00</updated>
<id>http://rawsyntax.com/blog/rspec-suite-runs-twice</id>
<category term="programming"/><category term="ruby"/>

      <content type="html"><![CDATA[<p>I worked on a rails project recently that had a peculiar problem. When running the specs via <code>rake spec</code> or <code>rspec</code> the whole suite would appear to run twice. I began digging around in <code>spec/spec_helper.rb</code> to try to figure out how RSpec could be configured to run twice instead of once. I also went to google and stack overflow and didn't find much.</p>

<p>Eventually I saw that there was both a <code>.rspec</code> file with configuration options and a few of the same configuration options repeated in the spec_helper. Once I removed the duplication (in particular the format documentation option was specified in both places), the RSpec suite output only appeared once. I did a little more digging and found that the test suite was not running twice, but rather the output was getting printed twice.</p>

<p>The easiest way to avoid this kind of problem is to decide on a project level to keep RSpec options in <code>spec/spec_helper.rb</code> or <code>.rspec</code>, but not both.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[On API Security]]></title>
<link href="http://rawsyntax.com/blog/on-api-security/"/>
<updated>2015-01-11T12:23:37-06:00</updated>
<id>http://rawsyntax.com/blog/on-api-security</id>
<category term="programming"/><category term="security"/>

      <content type="html"><![CDATA[<p>I was asked recently about designing a secure API.  There are 2 basic steps:</p>

<ol>
<li>Encrypt the connection (HTTPS)</li>
<li>Encrypt the paylod (HMAC-SHA1 for example)</li>
</ol>


<p>You could think up ways to go further but these are the basics that need to be covered.</p>

<!--more-->


<h2>Pitfalls to avoid</h2>

<p>While the above two steps are pretty straight forward and easy to read about and learn, there is one problem to watch out for. When an app developer starts learning about how to secure an API or a website, there is a possibility that that developer will start to consider him or herself an expert in security. This can lead to developing your own security libraries and using them.</p>

<p>This is a problem because that homebrewed library is going to have more bugs than the community vetted library that is out there. And you can remain blissfully unaware of these bugs because there's no public mailing list to notify you of vulnerabilities as they are discovered and patched.</p>

<p>When I work with security related code, I repeat to myself:</p>

<blockquote><p>I am not a security expert</p></blockquote>

<p>Then I go read about libraries used by the community and choose the ones that have been well vetted and around for a while.  It is not an area I choose to go with the new hotness in.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[How to Set Up Angular with Rails Part 3]]></title>
<link href="http://rawsyntax.com/blog/how-to-set-up-angular-with-rails-part-3/"/>
<updated>2014-12-08T13:07:27-06:00</updated>
<id>http://rawsyntax.com/blog/how-to-set-up-angular-with-rails-part-3</id>
<category term="angularjs"/><category term="programming"/>

      <content type="html"><![CDATA[<p><em>originally posted on the Intridea blog here: <a href="http://www.intridea.com/blog/2014/11/18/angular-with-rails-part-iii">http://www.intridea.com/blog/2014/11/18/angular-with-rails-part-iii</a></em></p>

<p><img class="" src="http://rawsyntax.com/images/rails-angularjs.jpg"></p>

<p>In Part 2 of Angular with Rails series, we covered creating a Rails API with tests in RSpec and setting up an AngularJS app that reads from the API.</p>

<!--more-->


<p>In Part 3 we will cover:</p>

<ul>
<li>Adding CSS</li>
<li>Adding editing functionality</li>
<li>Creating a custom filter</li>
<li>Setting up JavaScript tests</li>
</ul>


<h2>Setup Bootstrap Sass</h2>

<p>In order to support editing functionality we'll add some CSS to the UI. Following the README at <a href="https://github.com/twbs/bootstrap-sass">bootstrap-sass</a>, we'll add to our Gemfile:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">gem</span> <span class="s1">&#39;bootstrap-sass&#39;</span><span class="p">,</span> <span class="s1">&#39;~&gt; 3.3.0&#39;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Add to our app/assets/javascripts/application.js:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="c1">//= require bootstrap-sprockets</span>
</div></pre></td></tr></table></div></figure></p>

<p>Rename app/assets/stylesheets/application.css to application.css.sass (if you prefer sass over scss) and add:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">@import</span> <span class="s">&quot;bootstrap-sprockets&quot;</span>
</div><div class='line'><span class="nx">@import</span> <span class="s">&quot;bootstrap&quot;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Then we'll add some classes to our employee index in app/views/employees/index.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">ng-app=</span><span class="s">&#39;app.employeeApp&#39;</span> <span class="na">ng-controller=</span><span class="s">&#39;EmployeeListCtrl&#39;</span> <span class="na">class=</span><span class="s">&quot;col-xs-8&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;h1&gt;</span>Employees List<span class="nt">&lt;/h1&gt;</span>
</div><div class='line'>  <span class="nt">&lt;table</span> <span class="na">ng-if=</span><span class="s">&quot;employees&quot;</span> <span class="na">class=</span><span class="s">&quot;table table-hover table-striped&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;thead&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>Name<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>Email<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>SSN<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>Salary<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/thead&gt;</span>
</div><div class='line'>    <span class="nt">&lt;tbody&gt;</span>
</div><div class='line'>      <span class="nt">&lt;tr</span> <span class="na">ng-repeat=</span><span class="s">&quot;employee in employees&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.name}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.email}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.ssn}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.salary | currency}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/tr&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/tbody&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/table&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure></p>

<h2>Add the Edit API</h2>

<p>Next, we'll update our Rails API to support editing of employee records.  Let's start by adding some tests for the update method in spec/controllers/api/employees_controller_spec.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</div><div class='line'> </div><div class='line'><span class="n">describe</span> <span class="ss">Api</span><span class="p">:</span><span class="ss">:EmployeesController</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">before</span><span class="p">(</span><span class="ss">:each</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'>    <span class="vi">@employee</span> <span class="o">=</span> <span class="n">create</span><span class="p">(</span><span class="ss">:employee</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;Calhoun Tubbs&#39;</span><span class="p">,</span> <span class="ss">salary</span><span class="p">:</span> <span class="mi">50000</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="n">describe</span> <span class="s1">&#39;#index&#39;</span> <span class="k">do</span>
</div><div class='line'>    <span class="n">it</span> <span class="s1">&#39;should return a json array of users&#39;</span> <span class="k">do</span>
</div><div class='line'>      <span class="n">get</span> <span class="ss">:index</span>
</div><div class='line'>      <span class="n">result</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">body</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'>      <span class="n">expect</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="s1">&#39;name&#39;</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="s1">&#39;Calhoun Tubbs&#39;</span><span class="p">)</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="n">describe</span> <span class="s2">&quot;#update&quot;</span> <span class="k">do</span>
</div><div class='line'>    <span class="n">it</span> <span class="s1">&#39;should successfully respond to edits&#39;</span> <span class="k">do</span>
</div><div class='line'>      <span class="n">put</span> <span class="ss">:update</span><span class="p">,</span> <span class="nb">id</span><span class="p">:</span> <span class="vi">@employee</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="ss">employee</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>            <span class="nb">id</span><span class="p">:</span> <span class="vi">@employee</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</div><div class='line'>            <span class="ss">salary</span><span class="p">:</span> <span class="mi">60000</span>
</div><div class='line'>          <span class="p">}</span>
</div><div class='line'> </div><div class='line'>      <span class="n">expect</span><span class="p">(</span><span class="n">response</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">be_success</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'> </div><div class='line'>    <span class="n">it</span> <span class="s2">&quot;should change the employee&#39;s salary&quot;</span> <span class="k">do</span>
</div><div class='line'>      <span class="vi">@employee</span><span class="o">.</span><span class="n">update_attribute</span><span class="p">(</span><span class="ss">:salary</span><span class="p">,</span> <span class="mi">50000</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'>      <span class="n">put</span> <span class="ss">:update</span><span class="p">,</span> <span class="nb">id</span><span class="p">:</span> <span class="vi">@employee</span><span class="o">.</span><span class="n">id</span><span class="p">,</span> <span class="ss">employee</span><span class="p">:</span> <span class="p">{</span>
</div><div class='line'>            <span class="nb">id</span><span class="p">:</span> <span class="vi">@employee</span><span class="o">.</span><span class="n">id</span><span class="p">,</span>
</div><div class='line'>            <span class="ss">salary</span><span class="p">:</span> <span class="mi">60000</span>
</div><div class='line'>          <span class="p">}</span>
</div><div class='line'> </div><div class='line'>      <span class="n">expect</span><span class="p">(</span><span class="vi">@employee</span><span class="o">.</span><span class="n">reload</span><span class="o">.</span><span class="n">salary</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="mi">60000</span><span class="p">)</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>At this point, these tests will fail. We need to create an update method in our API controller, but first we must specify what params are allowed on update (Rails' strong parameters) at app/controllers/api/employees_controller.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="k">class</span> <span class="nc">Api</span><span class="o">::</span><span class="no">EmployeesController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</div><div class='line'>  <span class="c1"># section omitted</span>
</div><div class='line'>  <span class="kp">private</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="nf">employee_params</span>
</div><div class='line'>    <span class="n">attributes</span> <span class="o">=</span> <span class="o">[</span>
</div><div class='line'>      <span class="ss">:salary</span><span class="p">,</span>
</div><div class='line'>      <span class="ss">:name</span><span class="p">,</span>
</div><div class='line'>      <span class="ss">:email</span><span class="p">,</span>
</div><div class='line'>      <span class="ss">:ssn</span>
</div><div class='line'>    <span class="o">]</span>
</div><div class='line'> </div><div class='line'>    <span class="n">params</span><span class="o">.</span><span class="n">require</span><span class="p">(</span><span class="ss">:employee</span><span class="p">)</span><span class="o">.</span><span class="n">permit</span><span class="p">(</span><span class="n">attributes</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Now, our update action is simple. The code will try to update the employee object and render the errors if there's a problem.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="k">class</span> <span class="nc">Api</span><span class="o">::</span><span class="no">EmployeesController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</div><div class='line'>  <span class="c1"># section omitted</span>
</div><div class='line'>  <span class="k">def</span> <span class="nf">update</span>
</div><div class='line'>    <span class="n">employee</span> <span class="o">=</span> <span class="no">Employee</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>
</div><div class='line'> </div><div class='line'>    <span class="k">if</span> <span class="n">employee</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">employee_params</span><span class="p">)</span>
</div><div class='line'>      <span class="n">render</span> <span class="ss">json</span><span class="p">:</span> <span class="n">employee</span>
</div><div class='line'>    <span class="k">else</span>
</div><div class='line'>      <span class="n">render</span> <span class="ss">json</span><span class="p">:</span> <span class="n">employee</span><span class="o">.</span><span class="n">errors</span><span class="o">.</span><span class="n">messages</span><span class="p">,</span> <span class="ss">status</span><span class="p">:</span> <span class="ss">:bad_request</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'>  <span class="c1"># section omitted</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next run the tests to make sure they pass. For a more complex application there would be more tests, but in our example these will suffice.</p>

<h2>Add the Edit Front End</h2>

<p>For our employee edit functionality we'll define a modal dialog containing a form and a submit button. The Angular-bootstrap package contains a modal dialog tool. We'll add the angular-bootstrap package to our bower.json:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="s2">&quot;lib&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated lib assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="s2">&quot;angular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.2.25&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="s2">&quot;restangular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.4.0&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="s2">&quot;angular-bootstrap&quot;</span><span class="o">:</span> <span class="s2">&quot;v0.11.0&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="s2">&quot;vendor&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated vendor assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure></p>

<p>And <code>bundle exec rake bower:install</code></p>

<p>Next, require angular-bootstrap in app/assets/javascripts/application.js:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="c1">//= require jquery</span>
</div><div class='line'><span class="c1">//= require jquery_ujs</span>
</div><div class='line'><span class="c1">//= require angular</span>
</div><div class='line'><span class="c1">//= require angular-rails-templates</span>
</div><div class='line'><span class="c1">//= require lodash</span>
</div><div class='line'><span class="c1">//= require restangular</span>
</div><div class='line'> </div><div class='line'><span class="c1">//= require angular-bootstrap</span>
</div><div class='line'><span class="c1">//= require bootstrap-sprockets</span>
</div><div class='line'> </div><div class='line'><span class="c1">//= require angular-app/app</span>
</div><div class='line'><span class="c1">// rest of the file omitted</span>
</div></pre></td></tr></table></div></figure></p>

<p>Finally, we'll add it as a dependency to our angular app in app/assets/javascripts/angular-app/modules/employee.js.coffee.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="vi">@employeeApp = </span><span class="nx">angular</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>    <span class="s">&#39;restangular&#39;</span><span class="p">,</span>
</div><div class='line'>    <span class="s">&#39;ui.bootstrap&#39;</span>
</div><div class='line'>    <span class="s">&#39;templates&#39;</span>
</div><div class='line'>  <span class="p">])</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nf">-&gt;</span>
</div><div class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;employeeApp running&#39;</span>
</div><div class='line'>  <span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>Now, we need to add a modal controller to our AngularJS app. This controller will handle popping up a modal editable form and submitting it to our Rails API. In app/assets/javascripts/angular-app/controllers/employee/EmployeeListCtrl.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s">&quot;EmployeeListCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>  <span class="s">&#39;$scope&#39;</span><span class="p">,</span> <span class="s">&#39;EmployeeService&#39;</span><span class="p">,</span> <span class="s">&#39;$modal&#39;</span><span class="p">,</span>
</div><div class='line'>  <span class="nf">($scope, EmployeeService, $modal)-&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nv">$scope.editEmployee = </span><span class="nf">(employee) -&gt;</span>
</div><div class='line'>      <span class="nv">modalInstance = </span><span class="nx">$modal</span><span class="p">.</span><span class="nx">open</span><span class="p">({</span>
</div><div class='line'>        <span class="nv">templateUrl: </span><span class="s">&#39;employee/edit.html&#39;</span><span class="p">,</span>
</div><div class='line'>        <span class="nv">controller: </span><span class="s">&#39;EmployeeEditModalCtrl&#39;</span>
</div><div class='line'>        <span class="nv">size: </span><span class="s">&#39;lg&#39;</span>
</div><div class='line'>        <span class="nv">resolve:</span>
</div><div class='line'>          <span class="nv">employee: </span><span class="nf">-&gt;</span>
</div><div class='line'>            <span class="nx">employee</span>
</div><div class='line'>      <span class="p">})</span>
</div><div class='line'> </div><div class='line'>      <span class="nx">modalInstance</span><span class="p">.</span><span class="nx">result</span><span class="p">.</span><span class="nx">then</span><span class="p">(</span><span class="nf">-&gt;</span>
</div><div class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;edit closed&#39;</span>
</div><div class='line'>      <span class="p">)</span>
</div><div class='line'><span class="c1"># rest of file omitted</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, we'll create the modal controller at app/assets/javascripts/angular-app/controllers/employee/EmployeeEditModalCtrl.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s">&#39;EmployeeEditModalCtrl&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>  <span class="s">&#39;$scope&#39;</span><span class="p">,</span> <span class="s">&#39;$modalInstance&#39;</span><span class="p">,</span> <span class="s">&#39;employee&#39;</span><span class="p">,</span> <span class="nf">($scope, $modalInstance, employee)-&gt;</span>
</div><div class='line'>    <span class="nv">$scope.submitEmployee = </span><span class="nf">-&gt;</span>
</div><div class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;submit employee&#39;</span>
</div><div class='line'> </div><div class='line'>    <span class="nv">$scope.cancel = </span><span class="nf">-&gt;</span>
</div><div class='line'>      <span class="nx">$modalInstance</span><span class="p">.</span><span class="nx">dismiss</span><span class="p">(</span><span class="s">&#39;cancel&#39;</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'><span class="p">])</span>
</div></pre></td></tr></table></div></figure></p>

<p>In the above code we're defining a modal controller that receives the employee object we passed in the prior controller, along with function stubs for the save / cancel buttons in the dialog. Next, we need to define the edit form template in app/assets/javascripts/angular-app/templates/employee/edit.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div><div data-line='25' class='line-number'></div><div data-line='26' class='line-number'></div><div data-line='27' class='line-number'></div><div data-line='28' class='line-number'></div><div data-line='29' class='line-number'></div><div data-line='30' class='line-number'></div><div data-line='31' class='line-number'></div><div data-line='32' class='line-number'></div><div data-line='33' class='line-number'></div><div data-line='34' class='line-number'></div><div data-line='35' class='line-number'></div><div data-line='36' class='line-number'></div><div data-line='37' class='line-number'></div><div data-line='38' class='line-number'></div><div data-line='39' class='line-number'></div><div data-line='40' class='line-number'></div><div data-line='41' class='line-number'></div><div data-line='42' class='line-number'></div><div data-line='43' class='line-number'></div><div data-line='44' class='line-number'></div><div data-line='45' class='line-number'></div><div data-line='46' class='line-number'></div><div data-line='47' class='line-number'></div><div data-line='48' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;modal-header&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;h4</span> <span class="na">class=</span><span class="s">&quot;modal-title&quot;</span><span class="nt">&gt;</span>Edit Employee<span class="nt">&lt;/h4&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;modal-body&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;form</span> <span class="na">name=</span><span class="s">&quot;&quot;</span> <span class="na">ng-submit=</span><span class="s">&quot;submitEmployee(employee)&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;col-xs-12&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          <span class="nt">&lt;label&gt;</span>Name<span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;required&quot;</span><span class="nt">&gt;</span> required<span class="nt">&lt;/span&gt;&lt;/label&gt;</span>
</div><div class='line'>          <span class="nt">&lt;input</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;employee.name&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;col-xs-12&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          <span class="nt">&lt;label&gt;</span>Email<span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;required&quot;</span><span class="nt">&gt;</span> required<span class="nt">&lt;/span&gt;&lt;/label&gt;</span>
</div><div class='line'>          <span class="nt">&lt;input</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;employee.email&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;col-xs-12&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          <span class="nt">&lt;label&gt;</span>SSN<span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;required&quot;</span><span class="nt">&gt;</span> required<span class="nt">&lt;/span&gt;&lt;/label&gt;</span>
</div><div class='line'>          <span class="nt">&lt;input</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;employee.ssn&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;form-group&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;row&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;col-xs-12&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>          <span class="nt">&lt;label&gt;</span>Salary<span class="nt">&lt;span</span> <span class="na">class=</span><span class="s">&quot;required&quot;</span><span class="nt">&gt;</span> required<span class="nt">&lt;/span&gt;&lt;/label&gt;</span>
</div><div class='line'>          <span class="nt">&lt;input</span> <span class="na">class=</span><span class="s">&quot;form-control&quot;</span> <span class="na">ng-model=</span><span class="s">&quot;employee.salary&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;modal-footer&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>      <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;button&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-default&quot;</span> <span class="na">data-dismiss=</span><span class="s">&quot;modal&quot;</span> <span class="na">ng-click=</span><span class="s">&quot;cancel()&quot;</span><span class="nt">&gt;</span>Cancel<span class="nt">&lt;/button&gt;</span>
</div><div class='line'>      <span class="nt">&lt;button</span> <span class="na">type=</span><span class="s">&quot;submit&quot;</span> <span class="na">class=</span><span class="s">&quot;btn btn-primary&quot;</span><span class="nt">&gt;</span>Save Changes<span class="nt">&lt;/button&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/div&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/form&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Finally, if you run the code now you'll get an error loading the template. We need to tell our <code>angular-rails-templates</code> gem what the base path for our templates is. This is necessary because we are using the rails asset pipeline to combine our javascript files.  In config/application.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="nb">require</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s1">&#39;../boot&#39;</span><span class="p">,</span> <span class="bp"><strong>FILE</strong></span><span class="p">)</span>
</div><div class='line'><span class="nb">require</span> <span class="s1">&#39;rails/all&#39;</span>
</div><div class='line'> </div><div class='line'><span class="no">Bundler</span><span class="o">.</span><span class="n">require</span><span class="p">(</span><span class="o">*</span><span class="no">Rails</span><span class="o">.</span><span class="n">groups</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'><span class="k">module</span> <span class="nn">AngularExample</span>
</div><div class='line'>  <span class="k">class</span> <span class="nc">Application</span> <span class="o">&lt;</span> <span class="ss">Rails</span><span class="p">:</span><span class="ss">:Application</span>
</div><div class='line'>    <span class="c1"># the path relative to app/assets/javascripts</span>
</div><div class='line'>    <span class="n">config</span><span class="o">.</span><span class="n">angular_templates</span><span class="o">.</span><span class="n">ignore_prefix</span>  <span class="o">=</span> <span class="s1">&#39;angular-app/templates/&#39;</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, we can return to our employees index and provide an ng-click attribute to launch the edit form. We'll add this link on the employee name cell in the table in app/views/employees/index.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'># rest of the file omitted
</div><div class='line'><span class="nt">&lt;td&gt;&lt;a</span> <span class="na">ng-click=</span><span class="s">&quot;editEmployee(employee)&quot;</span><span class="nt">&gt;</span>&#x7b;&#x7b;employee.name}}<span class="nt">&lt;/a&gt;&lt;/td&gt;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Now, clicking an employee's name will launch a modal form with fields containing that employee's data. However, we still need to hook up the Save Changes button to our Rails API. In app/assets/javascripts/angular-app/controllers/employee/EmployeeEditModalCtrl.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s">&#39;EmployeeEditModalCtrl&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>  <span class="s">&#39;$scope&#39;</span><span class="p">,</span> <span class="s">&#39;$modalInstance&#39;</span><span class="p">,</span> <span class="s">&#39;employee&#39;</span><span class="p">,</span> <span class="nf">($scope, $modalInstance, employee)-&gt;</span>
</div><div class='line'>    <span class="nv">$scope.employee = </span><span class="nx">employee</span>
</div><div class='line'> </div><div class='line'>    <span class="nv">$scope.submitEmployee = </span><span class="nf">(employee)-&gt;</span>
</div><div class='line'>      <span class="nx">employee</span><span class="p">.</span><span class="nx">put</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span>
</div><div class='line'>        <span class="nx">$modalInstance</span><span class="p">.</span><span class="nx">close</span><span class="p">(</span><span class="s">&#39;saved&#39;</span><span class="p">)</span>
</div><div class='line'>      <span class="p">)</span>
</div><div class='line'>    <span class="c1"># section omitted</span>
</div><div class='line'><span class="p">])</span>
</div></pre></td></tr></table></div></figure></p>

<p>We can simply say <code>put()</code> above because we are using Restangular to manage that object.</p>

<p>One problem with the above code is that while the server is applying validation to the object, the client side AngularJS portion is not. One downside of using client-side MVC is the fact that validation from the server must often be duplicated on the client. The subject of AngularJS form validation could be a blog post on its own. I'll leave that as an exercise for the reader.</p>

<h2>Secure the UI</h2>

<p>Though the editing functionality now works, notice the page still shows each employee's social security number. In order to mask the SSN and only reveal it in edit form, we can create an AngularJS filter. In app/assets/javascripts/angular-app/filters/employee/empMaskNumber.js.coffee</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">).</span><span class="nx">filter</span><span class="p">(</span><span class="s">&#39;empMaskNumber&#39;</span><span class="p">,</span> <span class="p">()</span><span class="nf">-&gt;</span>
</div><div class='line'>  <span class="nf">(value, nonMaskLength) -&gt;</span>
</div><div class='line'>    <span class="k">if</span> <span class="nx">value</span><span class="o">?</span>
</div><div class='line'>      <span class="nv">maskLength = </span><span class="nx">value</span><span class="p">.</span><span class="nx">length</span> <span class="o">-</span> <span class="nx">nonMaskLength</span> <span class="o">-</span> <span class="mi">1</span>
</div><div class='line'>      <span class="k">if</span> <span class="nx">maskLength</span> <span class="o">&gt;</span> <span class="mi">0</span>
</div><div class='line'>        <span class="nv">v = </span><span class="nx">value</span><span class="p">.</span><span class="nx">split</span><span class="p">(</span><span class="s">&quot;&quot;</span><span class="p">)</span>
</div><div class='line'>        <span class="k">for</span> <span class="nx">i</span> <span class="k">in</span> <span class="p">[</span><span class="mi">0</span><span class="p">..</span><span class="nx">maskLength</span><span class="p">]</span> <span class="k">by</span> <span class="mi">1</span>
</div><div class='line'>          <span class="k">if</span> <span class="nx">v</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">!=</span> <span class="s">&#39;-&#39;</span>
</div><div class='line'>            <span class="nx">v</span><span class="p">[</span><span class="nx">i</span><span class="p">]</span> <span class="o">=</span> <span class="s">&#39;*&#39;</span>
</div><div class='line'>        <span class="nv">v = </span><span class="nx">v</span><span class="p">.</span><span class="nx">join</span><span class="p">(</span><span class="s">&#39;&#39;</span><span class="p">)</span>
</div><div class='line'>      <span class="k">else</span>
</div><div class='line'>        <span class="nx">value</span>
</div><div class='line'>    <span class="k">else</span>
</div><div class='line'>      <span class="nx">value</span>
</div><div class='line'><span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>It's recommended that you name filters with an app prefix to avoid colliding with AngularJS's built-in filters. Let's edit our employee table to make use of the filter in app/views/employees/index.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'># section omitted
</div><div class='line'><span class="nt">&lt;tr</span> <span class="na">ng-repeat=</span><span class="s">&quot;employee in employees&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;td&gt;&lt;a</span> <span class="na">ng-click=</span><span class="s">&quot;editEmployee(employee)&quot;</span><span class="nt">&gt;</span>&#x7b;&#x7b;employee.name}}<span class="nt">&lt;/a&gt;&lt;/td&gt;</span>
</div><div class='line'>  <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.email}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>  <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.ssn | empMaskNumber: 4 }}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>  <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.salary | currency}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'><span class="nt">&lt;/tr&gt;</span>
</div><div class='line'># section omitted
</div></pre></td></tr></table></div></figure></p>

<p>Viewing the employee table again you should see the SSN field being masked with asterisks except the last 4 digits. While this filter is simple and apparently works, when building more complex filters we will need javascript tests.</p>

<h2>Setup JavaScript Tests</h2>

<p>Next, we'll setup jasmine-rails. Add jasmine-rails to the Gemfile:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">group</span> <span class="ss">:test</span><span class="p">,</span> <span class="ss">:development</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">gem</span> <span class="s1">&#39;jasmine-rails&#39;</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>And add angular-mocks to the bower.json:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="s2">&quot;lib&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated lib assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="s2">&quot;angular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.2.25&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="s2">&quot;restangular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.4.0&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="s2">&quot;angular-bootstrap&quot;</span><span class="o">:</span> <span class="s2">&quot;v0.11.0&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="s2">&quot;angular-mocks&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.3.2&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="s2">&quot;vendor&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated vendor assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure></p>

<p>Then run:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>bundle install
</div><div class='line'>rails generate jasmine_rails:install
</div><div class='line'>bundle <span class="nb">exec </span>rake bower:install
</div></pre></td></tr></table></div></figure></p>

<p>Next, we need to setup our spec_helper. In app/assets/javascripts/spec_helper.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div><div data-line='20' class='line-number'></div><div data-line='21' class='line-number'></div><div data-line='22' class='line-number'></div><div data-line='23' class='line-number'></div><div data-line='24' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="c1">#= require application</span>
</div><div class='line'><span class="c1">#= require angular-mocks</span>
</div><div class='line'><span class="c1">#= require sinon</span>
</div><div class='line'> </div><div class='line'><span class="nx">beforeEach</span><span class="p">(</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app&#39;</span><span class="p">,</span> <span class="s">&#39;app.employeeApp&#39;</span><span class="p">))</span>
</div><div class='line'> </div><div class='line'><span class="nx">beforeEach</span> <span class="nx">inject</span> <span class="nf">(<em>$httpBackend</em>, <em>$compile</em>, $rootScope, $controller, $location, $injector, $timeout, $filter) -&gt;</span>
</div><div class='line'>  <span class="vi">@scope = </span><span class="nx">$rootScope</span><span class="p">.</span><span class="nx">$new</span><span class="p">()</span>
</div><div class='line'>  <span class="vi">@compile = </span><span class="nx"><em>$compile</em></span>
</div><div class='line'>  <span class="vi">@location = </span><span class="nx">$location</span>
</div><div class='line'>  <span class="vi">@controller = </span><span class="nx">$controller</span>
</div><div class='line'>  <span class="vi">@injector = </span><span class="nx">$injector</span>
</div><div class='line'>  <span class="vi">@http = </span><span class="nx">@injector</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="s">&#39;$httpBackend&#39;</span><span class="p">)</span>
</div><div class='line'>  <span class="vi">@timeout = </span><span class="nx">$timeout</span>
</div><div class='line'>  <span class="vi">@model = </span><span class="nf">(name) =&gt;</span>
</div><div class='line'>    <span class="nx">@injector</span><span class="p">.</span><span class="nx">get</span><span class="p">(</span><span class="nx">name</span><span class="p">)</span>
</div><div class='line'>  <span class="vi">@filter = </span><span class="nx">$filter</span>
</div><div class='line'>  <span class="vi">@eventLoop =</span>
</div><div class='line'>    <span class="nv">flush: </span><span class="o">=&gt;</span>
</div><div class='line'>      <span class="nx">@scope</span><span class="p">.</span><span class="nx">$digest</span><span class="p">()</span>
</div><div class='line'> </div><div class='line'><span class="nx">afterEach</span> <span class="nf">-&gt;</span>
</div><div class='line'>  <span class="nx">@http</span><span class="p">.</span><span class="nx">resetExpectations</span><span class="p">()</span>
</div><div class='line'>  <span class="nx">@http</span><span class="p">.</span><span class="nx">verifyNoOutstandingExpectation</span><span class="p">()</span>
</div></pre></td></tr></table></div></figure></p>

<p><strong>Note</strong> the beforeEach line above. As your application grows and more angular apps are added, they must also be added here to be available for testing. The above spec helper also requires <a href="http://sinonjs.org/">SinonJS</a>. Download the file and place it at vendor/assets/javascripts/sinon.js .</p>

<p>Now you should be able to run an empty test suite:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'><span class="nv">RAILS_ENV</span><span class="o">=</span><span class="nb">test </span>bundle <span class="nb">exec </span>rake spec:javascript
</div></pre></td></tr></table></div></figure></p>

<p>Which should return 0 specs and 0 failures. We are now ready to write our test for our filter defined above. In spec/javascripts/filters/emp_mask_number_spec.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="c1">#= require spec_helper</span>
</div><div class='line'> </div><div class='line'><span class="nx">describe</span> <span class="s">&#39;Filters&#39;</span><span class="p">,</span> <span class="nf">-&gt;</span>
</div><div class='line'>  <span class="nx">describe</span> <span class="s">&#39;EmpMaskNumber&#39;</span><span class="p">,</span> <span class="nf">-&gt;</span>
</div><div class='line'>    <span class="nx">beforeEach</span> <span class="nf">-&gt;</span>
</div><div class='line'>      <span class="vi">@maskFilter = </span><span class="nx">@filter</span><span class="p">(</span><span class="s">&#39;empMaskNumber&#39;</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'>    <span class="nx">it</span> <span class="s">&#39;should mask the value with asterisks&#39;</span><span class="p">,</span> <span class="nf">-&gt;</span>
</div><div class='line'>      <span class="vi">@value = </span><span class="s">&quot;123&quot;</span>
</div><div class='line'>      <span class="vi">@nonMaskLength = </span><span class="mi">0</span>
</div><div class='line'> </div><div class='line'>      <span class="nx">expect</span><span class="p">(</span><span class="nx">@maskFilter</span><span class="p">(</span><span class="nx">@value</span><span class="p">,</span> <span class="nx">@nonMaskLength</span><span class="p">)).</span><span class="nx">toEqual</span> <span class="s">&quot;***&quot;</span>
</div></pre></td></tr></table></div></figure></p>

<p>In a real application expect to have more specs than just the above. At this point though, you have everything you need to continue building your application and expanding.  You can find the code for this example on <a href="https://github.com/rawsyntax/rails-angular-api-example-edit">Github</a>.</br></p>

<p>Need to catch up on the Angular with Rails series?  Check these out:</p>

<ul>
<li><a href="http://www.intridea.com/blog/2014/9/25/how-to-set-up-angular-with-rails">Angular with Rails Part I</a></li>
<li><a href="http://www.intridea.com/blog/2014/10/14/how-to-set-up-angular-with-rails-part-2">Angular with Rails, Part II</a></li>
</ul>


<p>Resources:</p>

<ul>
<li><a href="https://github.com/rawsyntax/rails-angular-api-example-edit">Example App</a></li>
<li><a href="http://angular-ui.github.io/">AngularUI</a></li>
<li><a href="http://blog.zerosum.org/2014/01/17/rails-angular-jasmine.html">Jasmine spec_helper</a></li>
<li><a href="http://sinonjs.org/">SinonJS</a></li>
</ul>

]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[K750: a Solid Wireless Keyboard]]></title>
<link href="http://rawsyntax.com/blog/k750-a-solid-wireless-keyboard/"/>
<updated>2014-11-07T17:41:25-06:00</updated>
<id>http://rawsyntax.com/blog/k750-a-solid-wireless-keyboard</id>
<category term="equipment"/>

      <content type="html"><![CDATA[<p>I don't normally talk about computer equipment here, but I recently purchased the <a href="http://www.amazon.com/gp/product/B004MF11MU/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B004MF11MU&amp;linkCode=as2&amp;tag=rawsyntax-20&amp;linkId=3FQGUQDZRA46YYYF">K750 wireless keyboard</a> by Logitech. It's amazing because it is solar powered and therefore requires no batteries. Their manual says it can remain powered for 3 months in total darkness. I believe they tested this in my office. Also of note, I bought the mac version of the keyboard.  However, it also works with my PC, though I had to fool with their software a bit for the function keys to work.</p>

<p>The K750 is also a good deal cheaper than the official Apple wireless keyboard.</p>

<p>Previously I had an older version of the <a href="http://www.amazon.com/gp/product/B009SJR28W/ref=as_li_tl?ie=UTF8&amp;camp=1789&amp;creative=9325&amp;creativeASIN=B009SJR28W&amp;linkCode=as2&amp;tag=rawsyntax-20&amp;linkId=DJMWCALTWWVT6ERX">Razer Deathstalker</a>. It was nice, but there were wires everywhere. The K750 is nice and clean, and I haven't noticed any perceptible input lag / delay.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[How to Set Up Angular with Rails Part 2]]></title>
<link href="http://rawsyntax.com/blog/how-to-set-up-angular-with-rails-part-2/"/>
<updated>2014-11-04T08:51:14-06:00</updated>
<id>http://rawsyntax.com/blog/how-to-set-up-angular-with-rails-part-2</id>
<category term="angularjs"/><category term="programming"/>

      <content type="html"><![CDATA[<p><em>originally posted on the Intridea blog here: <a href="http://www.intridea.com/blog/2014/10/14/how-to-set-up-angular-with-rails-part-2">http://www.intridea.com/blog/2014/10/14/how-to-set-up-angular-with-rails-part-2</a></em></p>

<p><img class="" src="http://rawsyntax.com/images/rails-angularjs.jpg"></p>

<p>In <a href="http://www.intridea.com/blog/2014/9/25/how-to-set-up-angular-with-rails">Part I</a> of our Angular series, we illustrated the process for setting up an Angular app for Rails.</p>

<p>In Part 2 of this series, we'll be creating a basic HR app. This app will allow us to view employee information through an Angular app (edits and updates to be explained in Part 3 of this series). For more details, see code in Github link at the end of post.</p>

<!--more-->


<p>Here's a quick snapshot of what we'll be creating for our HR app:</p>

<ul>
<li>Setting up test frameworks</li>
<li>Creating a Rails API</li>
<li>Making the Angular frontend talk to the Rails API</li>
</ul>


<h2>Setup RSpec</h2>

<p>First, remove the <code>test/</code> directory. This is left over from our initial app setup in Part 1: How to Set Up Angular with Rails. Then add RSpec and factory_girl_rails to the Gemfile:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">group</span> <span class="ss">:development</span><span class="p">,</span> <span class="ss">:test</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">gem</span> <span class="s1">&#39;rspec-rails&#39;</span><span class="p">,</span> <span class="s1">&#39;~&gt; 3.1.0&#39;</span>
</div><div class='line'><span class="k">end</span>
</div><div class='line'> </div><div class='line'><span class="n">group</span> <span class="ss">:test</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">gem</span> <span class="s1">&#39;database_cleaner&#39;</span>
</div><div class='line'>  <span class="n">gem</span> <span class="s1">&#39;factory_girl_rails&#39;</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, bundle and install it.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>bundle install
</div><div class='line'>rails generate rspec:install
</div></pre></td></tr></table></div></figure></p>

<p>And edit your spec/spec_helper.rb to match:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div><div data-line='19' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="no">ENV</span><span class="o">[</span><span class="s2">&quot;RAILS_ENV&quot;</span><span class="o">]</span> <span class="o">||=</span> <span class="s1">&#39;test&#39;</span>
</div><div class='line'><span class="nb">require</span> <span class="no">File</span><span class="o">.</span><span class="n">expand_path</span><span class="p">(</span><span class="s2">&quot;../../config/environment&quot;</span><span class="p">,</span> <span class="bp"><strong>FILE</strong></span><span class="p">)</span>
</div><div class='line'><span class="nb">require</span> <span class="s1">&#39;rspec/rails&#39;</span>
</div><div class='line'><span class="nb">require</span> <span class="s1">&#39;rspec/autorun&#39;</span>
</div><div class='line'><span class="nb">require</span> <span class="s1">&#39;database_cleaner&#39;</span>
</div><div class='line'> </div><div class='line'><span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Migration</span><span class="o">.</span><span class="n">check_pending!</span> <span class="k">if</span> <span class="n">defined?</span><span class="p">(</span><span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Migration</span><span class="p">)</span>
</div><div class='line'><span class="no">RSpec</span><span class="o">.</span><span class="n">configure</span> <span class="k">do</span> <span class="o">|</span><span class="n">config</span><span class="o">|</span>
</div><div class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">include</span> <span class="ss">FactoryGirl</span><span class="p">:</span><span class="ss">:Syntax</span><span class="o">::</span><span class="no">Methods</span>
</div><div class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">infer_spec_type_from_file_location!</span>
</div><div class='line'> </div><div class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">expect_with</span> <span class="ss">:rspec</span> <span class="k">do</span> <span class="o">|</span><span class="n">expectations</span><span class="o">|</span>
</div><div class='line'>    <span class="n">expectations</span><span class="o">.</span><span class="n">include_chain_clauses_in_custom_matcher_descriptions</span> <span class="o">=</span> <span class="kp">true</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="n">config</span><span class="o">.</span><span class="n">mock_with</span> <span class="ss">:rspec</span> <span class="k">do</span> <span class="o">|</span><span class="n">mocks</span><span class="o">|</span>
</div><div class='line'>    <span class="n">mocks</span><span class="o">.</span><span class="n">verify_partial_doubles</span> <span class="o">=</span> <span class="kp">true</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<h2>Create the Employee Model</h2>

<p>Let's create the Employee model with a few fields:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>bundle <span class="nb">exec </span>rails generate model Employee name:string email:string ssn:string salary:integer
</div><div class='line'>bundle <span class="nb">exec </span>rake db:migrate
</div></pre></td></tr></table></div></figure></p>

<p>Next, we'll add some validations in app/models/employee.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="k">class</span> <span class="nc">Employee</span> <span class="o">&lt;</span> <span class="ss">ActiveRecord</span><span class="p">:</span><span class="ss">:Base</span>
</div><div class='line'>  <span class="c1"># regex taken from Devise gem</span>
</div><div class='line'>  <span class="n">validates_format_of</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">with</span><span class="p">:</span> <span class="sr">/\A[<sup>@\s]+@([<sup>@\s]+.)+[<sup>@\s]+\z/</span></sup></sup></sup>
</div><div class='line'>  <span class="n">validates_format_of</span> <span class="ss">:ssn</span><span class="p">,</span> <span class="ss">with</span><span class="p">:</span> <span class="sr">/\d{3}-\d{2}-\d{4}/</span>
</div><div class='line'>  <span class="n">validates_presence_of</span> <span class="ss">:name</span>
</div><div class='line'>  <span class="n">validates</span> <span class="ss">:salary</span><span class="p">,</span> <span class="ss">numericality</span><span class="p">:</span> <span class="p">{</span> <span class="n">only_integer</span><span class="p">:</span> <span class="kp">true</span> <span class="p">}</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Before creating the API interface for Angular, let's create a serializer for our Employee model.  This will allow our API to expose only those fields that are necessary to Angular frontend. Add ActiveModel Serializers to the Gemfile</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">gem</span> <span class="s1">&#39;active_model_serializers&#39;</span>
</div></pre></td></tr></table></div></figure></p>

<p>And <code>bundle install</code></p>

<h2>Create the Employee API</h2>

<p>In order to support the Angular frontend, we'll need to create an API controller at app/controllers/api/employees_controller.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="k">class</span> <span class="nc">Api</span><span class="o">::</span><span class="no">EmployeesController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</div><div class='line'>  <span class="n">respond_to</span> <span class="ss">:json</span>
</div><div class='line'> </div><div class='line'>  <span class="k">def</span> <span class="nf">index</span>
</div><div class='line'>    <span class="n">serialized_employees</span> <span class="o">=</span>
</div><div class='line'>      <span class="ss">ActiveModel</span><span class="p">:</span><span class="ss">:ArraySerializer</span>
</div><div class='line'>               <span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="no">Employee</span><span class="o">.</span><span class="n">all</span><span class="p">,</span> <span class="n">each_serializer</span><span class="p">:</span> <span class="no">EmployeeSerializer</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'>    <span class="n">render</span> <span class="ss">json</span><span class="p">:</span> <span class="n">serialized_employees</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Now we need to define that EmployeeSerializer in app/serializers/employee_serializer.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="k">class</span> <span class="nc">EmployeeSerializer</span> <span class="o">&lt;</span> <span class="ss">ActiveModel</span><span class="p">:</span><span class="ss">:Serializer</span>
</div><div class='line'>  <span class="n">attributes</span> <span class="ss">:id</span><span class="p">,</span> <span class="ss">:name</span><span class="p">,</span> <span class="ss">:email</span><span class="p">,</span> <span class="ss">:ssn</span><span class="p">,</span> <span class="ss">:salary</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>And expose this API to the frontend in config/routes.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">get</span> <span class="s1">&#39;example&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;example#index&#39;</span>
</div><div class='line'> </div><div class='line'>  <span class="n">namespace</span> <span class="ss">:api</span> <span class="k">do</span>
</div><div class='line'>    <span class="n">resources</span> <span class="ss">:employees</span><span class="p">,</span> <span class="ss">defaults</span><span class="p">:</span> <span class="p">{</span> <span class="nb">format</span><span class="p">:</span> <span class="ss">:json</span> <span class="p">}</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Finally we'll add some Employee data to db/seeds.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="no">Employee</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;MacGyver&quot;</span><span class="p">,</span> <span class="ss">email</span><span class="p">:</span> <span class="s2">&quot;test@example.com&quot;</span><span class="p">,</span> <span class="ss">ssn</span><span class="p">:</span> <span class="s2">&quot;555-55-5555&quot;</span><span class="p">,</span> <span class="ss">salary</span><span class="p">:</span> <span class="mi">50000</span><span class="p">)</span>
</div><div class='line'><span class="no">Employee</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="nb">name</span><span class="p">:</span> <span class="s2">&quot;Calhoun Tubbs&quot;</span><span class="p">,</span> <span class="ss">email</span><span class="p">:</span> <span class="s2">&quot;test2@example.com&quot;</span><span class="p">,</span> <span class="ss">ssn</span><span class="p">:</span> <span class="s2">&quot;123-45-6789&quot;</span><span class="p">,</span> <span class="ss">salary</span><span class="p">:</span> <span class="mi">60000</span><span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>Seed the database and start the Rails server:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>bundle <span class="nb">exec </span>rake db:seed
</div><div class='line'>rails s
</div></pre></td></tr></table></div></figure></p>

<p>Then we can open http://localhost:3000/api/employees in the browser which will return:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="p">[</span>
</div><div class='line'>  <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;MacGyver&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;email&quot;</span><span class="o">:</span> <span class="s2">&quot;test@example.com&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;ssn&quot;</span><span class="o">:</span> <span class="s2">&quot;555-55-5555&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;salary&quot;</span><span class="o">:</span> <span class="mi">50000</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;id&quot;</span><span class="o">:</span> <span class="mi">2</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;Calhoun Tubbs&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;email&quot;</span><span class="o">:</span> <span class="s2">&quot;test2@example.com&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;ssn&quot;</span><span class="o">:</span> <span class="s2">&quot;123-45-6789&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;salary&quot;</span><span class="o">:</span> <span class="mi">60000</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">]</span>
</div></pre></td></tr></table></div></figure></p>

<h2>Test the API</h2>

<p>Now that we've verified this action is set-up correctly, let's add a factory at spec/factories/employees.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="no">FactoryGirl</span><span class="o">.</span><span class="n">define</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">factory</span> <span class="ss">:employee</span> <span class="k">do</span>
</div><div class='line'>    <span class="nb">name</span> <span class="s1">&#39;Test Employee&#39;</span>
</div><div class='line'>    <span class="n">email</span> <span class="s1">&#39;test@example.com&#39;</span>
</div><div class='line'>    <span class="n">salary</span> <span class="mi">50000</span>
</div><div class='line'>    <span class="n">ssn</span> <span class="s1">&#39;123-45-6789&#39;</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, add a test at spec/controllers/api/employees_controller_spec.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="nb">require</span> <span class="s1">&#39;spec_helper&#39;</span>
</div><div class='line'> </div><div class='line'><span class="n">describe</span> <span class="ss">Api</span><span class="p">:</span><span class="ss">:EmployeesController</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">before</span><span class="p">(</span><span class="ss">:each</span><span class="p">)</span> <span class="k">do</span>
</div><div class='line'>    <span class="n">create</span><span class="p">(</span><span class="ss">:employee</span><span class="p">,</span> <span class="nb">name</span><span class="p">:</span> <span class="s1">&#39;Calhoun Tubbs&#39;</span><span class="p">)</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'> </div><div class='line'>  <span class="n">describe</span> <span class="s1">&#39;#index&#39;</span> <span class="k">do</span>
</div><div class='line'>    <span class="n">it</span> <span class="s1">&#39;should return a json array of users&#39;</span> <span class="k">do</span>
</div><div class='line'>      <span class="n">get</span> <span class="ss">:index</span>
</div><div class='line'>      <span class="n">result</span> <span class="o">=</span> <span class="no">JSON</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="n">response</span><span class="o">.</span><span class="n">body</span><span class="p">)</span>
</div><div class='line'> </div><div class='line'>      <span class="n">expect</span><span class="p">(</span><span class="n">result</span><span class="o">[</span><span class="mi">0</span><span class="o">][</span><span class="s1">&#39;name&#39;</span><span class="o">]</span><span class="p">)</span><span class="o">.</span><span class="n">to</span> <span class="n">eq</span><span class="p">(</span><span class="s1">&#39;Calhoun Tubbs&#39;</span><span class="p">)</span>
</div><div class='line'>    <span class="k">end</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>While the above test is somewhat trivial, this set up is great for verifying more complex logic in real world applications. In addition, the reason for adding an API spec prior to the Angular portion is to avoid playing the guessing game if/when problems arise; waiting to add the Angular framework helps to ease the deciphering process. If your Angular app isn't working correctly, its important to verify that the Rails backend is also behaving correctly -- the problem may not be an Angular issue.</p>

<h2>Create the Angular frontend</h2>

<p>You may want to take a look back at <a href="http://www.intridea.com/blog/2014/9/25/how-to-set-up-angular-with-rails">Part 1: How to Set Up Angular with Rails</a> to review how we setup the AngularJS frontend with Rails. Let's start by defining an app in app/assets/javascripts/angular-app/modules/employee.js.coffee.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="vi">@employeeApp = </span><span class="nx">angular</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>    <span class="s">&#39;restangular&#39;</span>
</div><div class='line'>  <span class="p">])</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nf">-&gt;</span>
</div><div class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;employeeApp running&#39;</span>
</div><div class='line'>  <span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, we'll define the Employees controller in app/controllers/employees.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">bundle</span> <span class="nb">exec</span> <span class="n">rails</span> <span class="n">g</span> <span class="n">controller</span> <span class="no">Employees</span> <span class="n">index</span>
</div></pre></td></tr></table></div></figure></p>

<p>Then, we'll add to the beginning of config/routes.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">root</span> <span class="s1">&#39;employees#index&#39;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Finally, let's start the Angular app in app/views/employees/index.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">ng-app=</span><span class="s">&#39;app.employeeApp&#39;</span> <span class="na">ng-controller=</span><span class="s">&#39;EmployeeListCtrl&#39;</span><span class="nt">&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure></p>

<p>If you run the Rails server and hit http://localhost:3000/ you'll get an error about the controller not being defined yet in the javascript console. Before we create the controller, let's setup a Employee model and service to handle fetching Employee records from the Rails API.</p>

<p>The Employee model is defined at app/assets/javascripts/angular-app/models/employee/Employee.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">angular</span><span class="o">.</span><span class="n">module</span><span class="p">(</span><span class="s1">&#39;app.employeeApp&#39;</span><span class="p">)</span><span class="o">.</span><span class="n">factory</span><span class="p">(</span><span class="s1">&#39;Employee&#39;</span><span class="p">,</span><span class="o">[</span><span class="p">()</span> <span class="o">-&gt;</span>
</div><div class='line'>  <span class="no">Employee</span> <span class="o">=</span> <span class="p">()</span> <span class="o">-&gt;</span>
</div><div class='line'> </div><div class='line'>  <span class="k">return</span> <span class="kp">new</span> <span class="no">Employee</span><span class="p">()</span>
</div><div class='line'><span class="o">]</span><span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>There is no special behavior here yet.  It is only returning the data that comes from the API.</p>

<p>To ease the process of working with APIs in Angular, let's add the restangular library to our project. In bower.json add restangular:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'>  <span class="s2">&quot;lib&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated lib assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="s2">&quot;angular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.2.25&quot;</span><span class="p">,</span>
</div><div class='line'>      <span class="s2">&quot;restangular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.4.0&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div></pre></td></tr></table></div></figure></p>

<p>Then run <code>bundle exec rake bower:install</code>. Next, we need to add restangular and its dependency lodash to app/assets/javascripts/application.js:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="c1">//= require jquery</span>
</div><div class='line'><span class="c1">//= require jquery_ujs</span>
</div><div class='line'><span class="c1">//= require angular</span>
</div><div class='line'><span class="c1">//= require angular-rails-templates</span>
</div><div class='line'><span class="c1">//= require lodash</span>
</div><div class='line'><span class="c1">//= require restangular</span>
</div></pre></td></tr></table></div></figure></p>

<p>Afterwards, we'll create the Employee service at app/assets/javascripts/angular-app/services/employee/EmployeeService.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">)</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">factory</span><span class="p">(</span><span class="s">&#39;EmployeeService&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>    <span class="s">&#39;Restangular&#39;</span><span class="p">,</span> <span class="s">&#39;Employee&#39;</span><span class="p">,</span>
</div><div class='line'>    <span class="nf">(Restangular, Employee)-&gt;</span>
</div><div class='line'> </div><div class='line'>      <span class="nv">model = </span><span class="s">&#39;employees&#39;</span>
</div><div class='line'> </div><div class='line'>      <span class="nx">Restangular</span><span class="p">.</span><span class="nx">extendModel</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="nf">(obj)-&gt;</span>
</div><div class='line'>        <span class="nx">angular</span><span class="p">.</span><span class="nx">extend</span><span class="p">(</span><span class="nx">obj</span><span class="p">,</span> <span class="nx">Employee</span><span class="p">)</span>
</div><div class='line'>      <span class="p">)</span>
</div><div class='line'> </div><div class='line'>      <span class="nv">list: </span><span class="p">()</span>     <span class="nf">-&gt;</span> <span class="nx">Restangular</span><span class="p">.</span><span class="nx">all</span><span class="p">(</span><span class="nx">model</span><span class="p">).</span><span class="nx">getList</span><span class="p">()</span>
</div><div class='line'>  <span class="p">])</span>
</div></pre></td></tr></table></div></figure></p>

<p>Finally, let's create the controller at app/assets/javascripts/angular-app/controllers/employee/EmployeeListCtrl.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.employeeApp&#39;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s">&quot;EmployeeListCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>  <span class="s">&#39;$scope&#39;</span><span class="p">,</span> <span class="s">&#39;EmployeeService&#39;</span><span class="p">,</span>
</div><div class='line'>  <span class="nf">($scope, EmployeeService)-&gt;</span>
</div><div class='line'> </div><div class='line'>    <span class="nx">EmployeeService</span><span class="p">.</span><span class="nx">list</span><span class="p">().</span><span class="nx">then</span><span class="p">(</span><span class="nf">(employees) -&gt;</span>
</div><div class='line'>      <span class="nv">$scope.employees = </span><span class="nx">employees</span>
</div><div class='line'>      <span class="nx">console</span><span class="p">.</span><span class="nx">dir</span> <span class="nx">employees</span>
</div><div class='line'>    <span class="p">)</span>
</div><div class='line'><span class="p">])</span>
</div></pre></td></tr></table></div></figure></p>

<p>If you run the Rails server and visit http://localhost:3000/ in the javascript console you'll see a print out of the Employee objects previously seeded to the database.  Next, let's add to the template code to show our Employee objects.  In app/views/employees/index.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div><div data-line='16' class='line-number'></div><div data-line='17' class='line-number'></div><div data-line='18' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">ng-app=</span><span class="s">&#39;app.employeeApp&#39;</span> <span class="na">ng-controller=</span><span class="s">&#39;EmployeeListCtrl&#39;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;table</span> <span class="na">ng-if=</span><span class="s">&quot;employees&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>    <span class="nt">&lt;thead&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>Name<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>Email<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>SSN<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>      <span class="nt">&lt;th&gt;</span>Salary<span class="nt">&lt;/th&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/thead&gt;</span>
</div><div class='line'>    <span class="nt">&lt;tbody&gt;</span>
</div><div class='line'>      <span class="nt">&lt;tr</span> <span class="na">ng-repeat=</span><span class="s">&quot;employee in employees&quot;</span><span class="nt">&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.name}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.email}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.ssn}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>        <span class="nt">&lt;td&gt;</span>&#x7b;&#x7b;employee.salary | currency}}<span class="nt">&lt;/td&gt;</span>
</div><div class='line'>      <span class="nt">&lt;/tr&gt;</span>
</div><div class='line'>    <span class="nt">&lt;/tbody&gt;</span>
</div><div class='line'>  <span class="nt">&lt;/table&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Open http://localhost:3000 and notice the salary field. We used the currency filter to handle formatting that data. Salary comes back from the API as a plain integer value. Angular has a number of useful filters that are included by default.</p>

<p>The above example is very basic. However, we created database objects, exposed those via an API, tested the API, and created an Angular app to handle the frontend. That's no small task! A few pieces are still missing though.  While our Ruby API has tests, our Angular app has no tests at all. Furthermore, our employee management app is view-only.</p>

<p><strong>Github code for HR app <a href="https://github.com/rawsyntax/rails-angular-api-example">here</a></strong>.</p>

<p>In Part 3, we'll setup javascript tests, and add editing functionality to our Angular frontend.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[How to Set Up Angular With Rails]]></title>
<link href="http://rawsyntax.com/blog/how-to-set-up-angular-with-rails/"/>
<updated>2014-09-26T21:06:48-05:00</updated>
<id>http://rawsyntax.com/blog/how-to-set-up-angular-with-rails</id>
<category term="angularjs"/><category term="programming"/>

      <content type="html"><![CDATA[<p><em>originally posted on the Intridea blog here: <a href="http://www.intridea.com/blog/2014/9/25/how-to-set-up-angular-with-rails">http://www.intridea.com/blog/2014/9/25/how-to-set-up-angular-with-rails</a></em></p>

<p><img class="" src="http://rawsyntax.com/images/rails-angularjs.jpg"></p>

<p>To get started lets create a new rails app.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>gem install rails -v 4.1
</div><div class='line'>rails new angular_example
</div></pre></td></tr></table></div></figure></p>

<p>In this app, I chose not to use turbolinks. It's possible to use Angular with Rails and turbolinks, but the Angular app bootstrap process is more complex. I find that turbolinks and Angular serve the same purpose, which is to make the app respond faster.  Adding turbolinks, in addition to Angular, adds a lot of complexity and not much benefit.</p>

<!--more-->


<h2>Remove Turbolinks</h2>

<p>Removing turbolinks requires removing it from the Gemfile.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">gem</span> <span class="s1">&#39;turbolinks&#39;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Remove the require from app/assets/javascripts/application.js</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="c1">//= require turbolinks</span>
</div></pre></td></tr></table></div></figure></p>

<h2>Add AngularJS to the Asset Pipeline</h2>

<p>In order to get Angular to work with the Rails asset pipeline we need to add to the Gemfile:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="n">gem</span> <span class="s1">&#39;angular-rails-templates&#39;</span>
</div><div class='line'><span class="n">gem</span> <span class="s1">&#39;bower-rails&#39;</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, we can install these gems into our bundle.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>bundle install
</div></pre></td></tr></table></div></figure></p>

<p>We added bower so that we can install the AngularJS dependency.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>rails g bower_rails:initialize json
</div></pre></td></tr></table></div></figure></p>

<p>When adding Angular to bower.json, I prefer to specify the most recent version rather than going with the "latest". This avoids having your app randomly break when a new version is released and your bower installs again.</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="p">{</span>
</div><div class='line'>  <span class="s2">&quot;lib&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated lib assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>      <span class="s2">&quot;angular&quot;</span><span class="o">:</span> <span class="s2">&quot;v1.2.25&quot;</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">},</span>
</div><div class='line'>  <span class="s2">&quot;vendor&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="s2">&quot;name&quot;</span><span class="o">:</span> <span class="s2">&quot;bower-rails generated vendor assets&quot;</span><span class="p">,</span>
</div><div class='line'>    <span class="s2">&quot;dependencies&quot;</span><span class="o">:</span> <span class="p">{</span>
</div><div class='line'>    <span class="p">}</span>
</div><div class='line'>  <span class="p">}</span>
</div><div class='line'><span class="p">}</span>
</div></pre></td></tr></table></div></figure></p>

<p>Now that bower.json is setup with the right dependencies, let's install them:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>bundle <span class="nb">exec </span>rake bower:install
</div></pre></td></tr></table></div></figure></p>

<h2>Organize the Angular App</h2>

<p>At this point we'll create the following folder structure in app/assets/javascript/angular-app:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>templates/
</div><div class='line'>modules/
</div><div class='line'>filters/
</div><div class='line'>directives/
</div><div class='line'>models/
</div><div class='line'>services/
</div><div class='line'>controllers/
</div></pre></td></tr></table></div></figure></p>

<p>This structure is only a convention and is not enforced by Angular (unlike file naming and organization in Rails). This project structure allows for a single web app to be easily composed of multiple smaller Angular modules rather than one giant Angular app for the whole site.</p>

<p>In app/assets/javascripts/application.js add Angular, the template helper, and the Angular app file structure. That file should now read like this:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div></pre></td><td class='main  javascript'><pre><div class='line'><span class="c1">//= require jquery</span>
</div><div class='line'><span class="c1">//= require jquery_ujs</span>
</div><div class='line'><span class="c1">//= require angular</span>
</div><div class='line'><span class="c1">//= require angular-rails-templates</span>
</div><div class='line'> </div><div class='line'><span class="c1">//= require angular-app/app</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/templates</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/modules</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/filters</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/directives</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/models</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/services</span>
</div><div class='line'><span class="c1">//= require_tree ./angular-app/controllers</span>
</div></pre></td></tr></table></div></figure></p>

<h2>Bootstrap the Angular App</h2>

<p>Next, we'll setup the Angular app bootstrapping. Create app/assets/javascripts/angular-app/app.js.coffee:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div><div data-line='9' class='line-number'></div><div data-line='10' class='line-number'></div><div data-line='11' class='line-number'></div><div data-line='12' class='line-number'></div><div data-line='13' class='line-number'></div><div data-line='14' class='line-number'></div><div data-line='15' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="vi">@app = </span><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>  <span class="c1"># additional dependencies here, such as restangular</span>
</div><div class='line'>  <span class="s">&#39;templates&#39;</span>
</div><div class='line'><span class="p">])</span>
</div><div class='line'> </div><div class='line'><span class="c1"># for compatibility with Rails CSRF protection</span>
</div><div class='line'> </div><div class='line'><span class="nx">@app</span><span class="p">.</span><span class="nx">config</span><span class="p">([</span>
</div><div class='line'>  <span class="s">&#39;$httpProvider&#39;</span><span class="p">,</span> <span class="nf">($httpProvider)-&gt;</span>
</div><div class='line'>    <span class="nx">$httpProvider</span><span class="p">.</span><span class="nx">defaults</span><span class="p">.</span><span class="nx">headers</span><span class="p">.</span><span class="nx">common</span><span class="p">[</span><span class="s">&#39;X-CSRF-Token&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nx">$</span><span class="p">(</span><span class="s">&#39;meta[name=csrf-token]&#39;</span><span class="p">).</span><span class="nx">attr</span><span class="p">(</span><span class="s">&#39;content&#39;</span><span class="p">)</span>
</div><div class='line'><span class="p">])</span>
</div><div class='line'> </div><div class='line'><span class="nx">@app</span><span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nf">-&gt;</span>
</div><div class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;angular app running&#39;</span>
</div><div class='line'><span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>Then, we'll create an Angular module at app/assets/javascripts/angular-app/modules/example.js.coffee.erb</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="vi">@exampleApp = </span><span class="nx">angular</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.exampleApp&#39;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>    <span class="c1"># additional dependencies here</span>
</div><div class='line'>  <span class="p">])</span>
</div><div class='line'>  <span class="p">.</span><span class="nx">run</span><span class="p">(</span><span class="nf">-&gt;</span>
</div><div class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;exampleApp running&#39;</span>
</div><div class='line'>  <span class="p">)</span>
</div></pre></td></tr></table></div></figure></p>

<p>Following the Angular module, we'll create an Angular controller for this app at app/assets/javascripts/angular-app/controllers/exampleCtrl.js.coffee</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div><div data-line='5' class='line-number'></div><div data-line='6' class='line-number'></div><div data-line='7' class='line-number'></div><div data-line='8' class='line-number'></div></pre></td><td class='main  coffeescript'><pre><div class='line'><span class="nx">angular</span><span class="p">.</span><span class="nx">module</span><span class="p">(</span><span class="s">&#39;app.exampleApp&#39;</span><span class="p">).</span><span class="nx">controller</span><span class="p">(</span><span class="s">&quot;ExampleCtrl&quot;</span><span class="p">,</span> <span class="p">[</span>
</div><div class='line'>  <span class="s">&#39;$scope&#39;</span><span class="p">,</span>
</div><div class='line'>  <span class="nf">($scope)-&gt;</span>
</div><div class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span> <span class="s">&#39;ExampleCtrl running&#39;</span>
</div><div class='line'> </div><div class='line'>    <span class="nv">$scope.exampleValue = </span><span class="s">&quot;Hello angular and rails&quot;</span>
</div><div class='line'> </div><div class='line'><span class="p">])</span>
</div></pre></td></tr></table></div></figure></p>

<p>Now we need to add a route to Rails to pass control over to Angular. In config/routes.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="no">Rails</span><span class="o">.</span><span class="n">application</span><span class="o">.</span><span class="n">routes</span><span class="o">.</span><span class="n">draw</span> <span class="k">do</span>
</div><div class='line'>  <span class="n">get</span> <span class="s1">&#39;example&#39;</span> <span class="o">=&gt;</span> <span class="s1">&#39;example#index&#39;</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>Next, we'll generate the Rails controller to respond to that route:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  sh'><pre><div class='line'>rails g controller Example
</div></pre></td></tr></table></div></figure></p>

<p>In app/controllers/example_controller.rb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div></pre></td><td class='main  ruby'><pre><div class='line'><span class="k">class</span> <span class="nc">ExampleController</span> <span class="o">&lt;</span> <span class="no">ApplicationController</span>
</div><div class='line'>  <span class="k">def</span> <span class="nf">index</span>
</div><div class='line'>  <span class="k">end</span>
</div><div class='line'><span class="k">end</span>
</div></pre></td></tr></table></div></figure></p>

<p>In the view we need to specify which Angular app, and which Angular controller will drive this page.</p>

<p>In app/views/example/index.html.erb:</p>

<p><figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div><div data-line='2' class='line-number'></div><div data-line='3' class='line-number'></div><div data-line='4' class='line-number'></div></pre></td><td class='main  html'><pre><div class='line'><span class="nt">&lt;div</span> <span class="na">ng-app=</span><span class="s">&#39;app.exampleApp&#39;</span> <span class="na">ng-controller=</span><span class="s">&#39;ExampleCtrl&#39;</span><span class="nt">&gt;</span>
</div><div class='line'>  <span class="nt">&lt;p&gt;</span>Value from ExampleCtrl:<span class="nt">&lt;/p&gt;</span>
</div><div class='line'>  <span class="nt">&lt;p&gt;</span>&#x7b;&#x7b; exampleValue }}<span class="nt">&lt;/p&gt;</span>
</div><div class='line'><span class="nt">&lt;/div&gt;</span>
</div></pre></td></tr></table></div></figure></p>

<p>To view the app, start your Rails server and visit http://localhost:3000/example</p>

<p>You can find the code generated here <a href="https://github.com/rawsyntax/rails-angular-example">https://github.com/rawsyntax/rails-angular-example</a></p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: Term, Ansi Term]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-term/"/>
<updated>2014-05-18T14:43:47-05:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-term</id>
<category term="code"/><category term="learn-emacs"/><category term="terminal"/><category term="tools"/>

      <content type="html"><![CDATA[<p>When I first started using Multi-Term to run my
<a href="http://rawsyntax.com/blog/learn-emacs-zsh-and-multi-term/">terminal in emacs</a>,
much of the documentation I saw on the
<a href="http://www.emacswiki.org/emacs/AnsiTerm">EmacsWiki</a> referenced both
<code>ansi-term</code> and <code>term</code>. This left me somewhat confused as to which I
should be using and what the difference was. I ignored this for some
time while I got my Multi-Term setup working correctly.</p>

<h2>Look It Up</h2>

<p>When the time came to find out the truth, I knew I could just ask
emacs.  I used <code>C-h a</code> to invoke <code>apropros</code> and fed it both
<code>ansi-term</code> and <code>term</code>.  The output linked me to <code>term.el</code> and I read
the source for both methods. It turns out that both methods work
similarly, but simply use different buffer names.  As
<a href="http://www.emacswiki.org/emacs/AnsiTerm">EmacsWiki</a> explains, the
difference is largely historical at this point. Previously, plain
<code>term-mode</code> was less able to display colors than <code>ansi-term</code>.</p>

<p>This is one of the features I like best about emacs. It has a built-in
help system that allowed me to search for term related documentation,
and eventually led me to the source code implementation of the method
in question. All without leaving the editor!</p>

<p>I have some enhancements to my previous post
<a href="http://rawsyntax.com/blog/learn-emacs-zsh-and-multi-term/">zsh and multi-term in emacs</a>,
and the fixes and changes that I implemented all came from reading the
source of <code>term.el</code> and referring to <a href="http://emacswiki.org">EmacsWiki</a>
as needed.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Getting started with Raspberry Pi]]></title>
<link href="http://rawsyntax.com/blog/getting-started-with-raspberry-pi/"/>
<updated>2014-03-26T16:29:00-05:00</updated>
<id>http://rawsyntax.com/blog/getting-started-with-raspberry-pi</id>
<category term="raspberry-pi"/>

      <content type="html"><![CDATA[<p>In this post I'm going to  go over each step to get your Raspberry Pi
ready for ruby development.  In setting up my RPi I've found that
there is a lot of outdated information on the web. I've created an up
to date list of steps here.</p>

<p>Note: Be ready to step away from the computer during the setup
process. The RPi is cool, but quite slow.</p>

<h2>Supplies</h2>

<p>At a minimum you will need (these are the parts I bought):</p>

<ul>
<li><a href="http://amzn.to/1mvnFFs">RPi Model B</a></li>
<li><a href="http://amzn.to/1ht8zJo">Class 10 SD Card</a></li>
<li><a href="http://amzn.to/NVdgDN">Ethernet cable</a></li>
<li><a href="http://amzn.to/NVe8Io">Power Supply</a></li>
<li><a href="http://amzn.to/1gD5mvr">Charging Cable</a></li>
</ul>


<p>Note about power supplies: There are cheaper ones, but you have to
weigh that risk against setting your home on fire. In particular, you
want to verify that the power supply is UL-certified.</p>

<p>This cost me about $67, but could be cheaper if you already have some
of these parts.</p>

<h2>Pick an OS</h2>

<p>The first step is to pick which distribution to run on your RPi.
Looking at the
<a href="http://elinux.org/RPi_Distributions#Comparison">comparison table</a> I
decided to go with <a href="http://www.raspbian.org/">Raspbian</a>.  This was
chiefly because I've used Debian and Ubuntu in the past. That being
said, there are many other distrubtions available for RPi.</p>

<p>The next step is to download the image
<a href="http://www.raspberrypi.org/downloads">here</a>.  I downloaded the
<code>2014-01-07-wheezy-raspbian.zip</code> version and unzipped it.</p>

<h2>Set up the SD Card</h2>

<p>You will need an SD card for storage on the RPi. I went with
<a href="http://amzn.to/1ht8zJo">Transcend 32 GB Class 10 SDHC</a>.  Class 10 is
the recommended speed for use with RPi. Any faster would be limited by
the RPi's bus.</p>

<p>Plug the SD card into your Mac and determine disk name by running
<code>diskutil list</code>.</p>

<p>The output will be similar to this:</p>

<pre><code>/dev/disk0
   #:                       TYPE NAME                    SIZE        IDENTIFIER
   0:      GUID_partition_scheme                        *500.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            499.4 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *998.6 GB   disk2
   1:                        EFI EFI                     209.7 MB   disk2s1
   2:                  Apple_HFS Time Machine Backups    998.2 GB   disk2s2
/dev/disk5
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *32.1 GB    disk5
   1:             Windows_FAT_32 boot                    58.7 MB    disk5s1
   2:                      Linux                         32.1 GB    disk5s2
</code></pre>

<p>You can determine which <code>/dev/disk</code> your RPi is by matching up the
Volume name with the value in the NAME column.  Here my RPi is
<code>/dev/disk5</code>, and the volume name is <code>boot</code>.</p>

<p>Next, unmount the volume with <code>sudo diskutil umount /Volumes/boot</code>.
If you don't unmount the SD card first, you will receive an error about the
device being busy when trying to image it.</p>

<p>Finally, copy the OS image to the SD card with <code>dd if=2014-01-07-wheezy-raspbian.img of=/dev/disk5 bs=1</code></p>

<p>Go have some non-computer time.  This took roughly an hour when I did it.</p>

<h2>Boot the OS on your RPi</h2>

<p>Once <code>dd</code> has completed:</p>

<ul>
<li>Remove the SD card from your Mac</li>
<li>Plug the SD card into the RPi</li>
<li>Plug your RPi into your network with an ethernet cable</li>
<li>Power the RPi on by plugging it in and wait a couple minutes for it
to boot</li>
<li>Look up the address via your router</li>
</ul>


<p><img class="" src="http://rawsyntax.com/images/raspi-network.png"></p>

<p>Here, my RPi is listed as <code>192.168.1.229</code></p>

<p>Login via ssh with default user (pi) and default password (raspberry)
<code>ssh pi@192.168.1.229</code></p>

<p>If you run <code>df -h</code> you will see that your install isn't using all of
the available storage on the SD card. You need to expand the SD card
by running:</p>

<p><code>sudo raspi-config</code> and selecting the expand option.</p>

<p><img class="" src="http://rawsyntax.com/images/raspi-config.png"></p>

<p>I also recommend selecting option 2 and changing the default password.</p>

<p>Out of the box my RPi was set to the <code>en_GB</code> locale. You can set the
correct locale and timezone by running:</p>

<pre><code>sudo dpkg-reconfigure locales
sudo dpkg-reconfigure tzdata
</code></pre>

<p>Next, make sure the latest packages are available before you get to
installing software:</p>

<p><code>sudo apt-get update</code></p>

<h2>Set your Shell (optional)</h2>

<p>Raspbian comes with bash as the default shell.  If that's fine for
you, skip this section.</p>

<p>Zsh can be installed by running:</p>

<pre><code>sudo apt-get install zsh
chsh
</code></pre>

<p>Then enter <code>/usr/bin/zsh</code> for the new shell.</p>

<h2>Set up Ruby</h2>

<p>I found the following dependency was missing out of the box:
<code>sudo apt-get install libssl-dev</code></p>

<p>Get rbenv with:</p>

<pre><code>git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
git clone https://github.com/sstephenson/rbenv-gem-rehash.git ~/.rbenv/plugins/rbenv-gem-rehash
</code></pre>

<p>Add the following to your <code>.bash_profile</code> or <code>.zshrc</code></p>

<p><code>eval "$(rbenv init -)"</code>
Reload your shell (or simply login again) and run:</p>

<pre><code>rbenv install 2.1.1
rbenv global 2.1.1
</code></pre>

<p>Or whatever version you prefer.  To confirm everything is set up run:</p>

<pre><code>ruby -v
ruby 2.1.1p76 (2014-02-24 revision 45161) [armv6l-linux-eabihf]
</code></pre>

<h2>Set up Node.js</h2>

<p>I set up node because some ruby gems require a javascript runtime.
Installing node looked easier than getting v8 to work on RPi. Simply run:</p>

<pre><code>wget http://node-arm.herokuapp.com/node_latest_armhf.deb
sudo dpkg -i node_latest_armhf.deb`
</code></pre>

<h2>On the Next RPi Post</h2>

<p>I've noticed some flakiness on my laptop's Internet
connection, but I'm unclear what the cause is -- is it Comcast or some
of the servers I hit actually being down from time to time?</p>

<p>In my next post, I'll go over how I set up my first RPi project. It
will run a basic dashboard displaying various network connectivity metrics.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: Birthday Easter Egg]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-birthday-easter-egg/"/>
<updated>2014-02-11T19:51:24-06:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-birthday-easter-egg</id>
<category term="learn-emacs"/>

      <content type="html"><![CDATA[<p>Part of the charm of Emacs is its collection of <a href="http://en.wikipedia.org/wiki/Easter_egg_(media)">easter eggs</a>. It contains a tetris clone, Towers of Hanoi, Conway's game of life, and <a href="http://www.emacswiki.org/emacs/CategoryGames">others</a>.</p>

<p>One Easter egg I discovered by accident (through using <a href="http://rawsyntax.com/blog/learn-emacs-smex/">smex</a>) is:
<figure class='code'><div class='highlight'><table><td class='line-numbers' aria-hidden='true'><pre><div data-line='1' class='line-number'></div></pre></td><td class='main  plain'><pre><div class='line'>M-x animate-birthday-present</div></pre></td></tr></table></div></figure></p>

<p>Which takes an argument (the person's name) and displays an animation wishing that person happy birthday.  My favorite Easter egg is <code>gomoku</code>.  It is a fun 5-in-a-row game against the computer.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Keep your API Documentation Honest]]></title>
<link href="http://rawsyntax.com/blog/keep-your-api-documentation-honest/"/>
<updated>2014-01-13T13:41:41-06:00</updated>
<id>http://rawsyntax.com/blog/keep-your-api-documentation-honest</id>
<category term="documentation"/>

      <content type="html"><![CDATA[<p><em>originally posted on the Intridea blog here: <a href="http://www.intridea.com/blog/2014/1/22/keepin-your-api-honest">http://www.intridea.com/blog/2014/1/22/keepin-your-api-honest</a></em></p>

<p>We've all come across API documentation that is out of date, lacking details, or just plain wrong!  Often times an API’s documentation is entirely separate from the code itself, and there is no verification of the documentation's accuracy.</p>

<p>So how do we overcome this?  Well, one solution for this problem is to generate the documentation as a result of passing <em>acceptance tests</em>.</p>

<p>The <a href="https://github.com/zipmark/rspec_api_documentation">rspec_api_documentation</a> gem allows you to write specs that generate HTML formatted documentation.  The rake task included for running your doc specs is <code>rake docs:generate</code>, which puts the HTML files in the project's <code>./doc</code> directory. If any specs fail, the documentation doesn't generate.</p>

<p>Once the documentation is generated, it’s time to add a documentation viewer to your API server.</p>

<p>There are two gems for serving API documentation:</p>

<ul>
<li>For rails use <a href="https://github.com/modeset/apitome">apitome</a></li>
<li>For rack applications (like <a href="https://github.com/intridea/grape">grape</a>) use <a href="https://github.com/smartlogic/raddocs/">raddocs</a></li>
</ul>


<p>Mounting the API documentation server as part of your API server and running <code>rake docs:generate</code> as part of the deployment process ensures your documentation is up to date and available.</p>

<p>So, if you're going to create an API, use <a href="https://github.com/intridea/grape">grape</a>,
<a href="https://github.com/zipmark/rspec_api_documentation">rspec_api_documentation</a>, and <a href="https://github.com/smartlogic/raddocs/">raddocs</a> to ensure testable, accurate, and up to date documentation. Your API users will thank you.</p>

<p>Included is an example repository using these tools here: <a href="https://github.com/rawsyntax/api_documentation_template">api_documentation_template</a>.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: The Extensible Editor]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-the-extensible-editor/"/>
<updated>2013-11-17T09:34:23-06:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-the-extensible-editor</id>
<category term="learn-emacs"/>

      <content type="html"><![CDATA[<p>Emacs bills itself as being the extensible self-documenting editor.  When I first started using it I was suspicious that not many people take advantage of the extensible part.  I could not have been more wrong.  What follows is a short story of a hack to get Emacs to do what I want.</p>

<h2>Making Emacs Work for Me</h2>

<p>I use <a href="https://github.com/jhelwig/ack-and-a-half">ack-and-a-half</a> to interact with ack (instead of grep) via Emacs.  Some time ago I read about <a href="https://github.com/ggreer/the_silver_searcher">ag</a>, but there wasn't an Emacs mode for it available.  I checked again last week, and found that there is now <a href="https://github.com/Wilfred/ag.el">ag.el</a>.  After trying it, I found that it doesn't work exactly like ack-and-a-half.  I wanted to switch to ag, but did not want to give up ack-and-a-half's behavior.</p>

<p>So I did the emacs thing and had a look at ag.el's source to assess how much effort changing it would be. It was too much effort.  I then realized due to the close compatibility between ack and ag, I could probably quickly hack up ack-and-a-half to change the backend to ag.</p>

<p>After an hour of work <a href="https://github.com/rawsyntax/ag-and-a-half">ag-and-a-half</a> was born. The result is that my former ack-and-a-half frontend now runs 3x-5x faster (ag's performance promise).  The work that I did was largely a wholesale find and replace.  The right thing to do would be to make the backend swappable between ack and ag.  However, the quick hack works great for now.</p>

<p>I find this is a good example of Emacs' extensibility and an example actually taking advantage of it.  If you're using Emacs without customizing or extending it, you're missing out.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: Zsh and Multi-Term]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-zsh-and-multi-term/"/>
<updated>2013-11-03T14:12:27-06:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-zsh-and-multi-term</id>
<category term="code"/><category term="learn-emacs"/><category term="terminal"/><category term="tools"/>

      <content type="html"><![CDATA[<p>I've been experimenting with running <code>multi-term</code> in emacs instead of using an external program like iTerm2.  While <code>multi-term</code> is good, it can have some show-stopping  problems out of the box.  As usual, <a href="http://emacswiki.org">EmacsWiki</a> has some good tips, but there isn't a comprehensive setup all on one page.</p>

<p>View a short demo of this integration <a href="http://www.youtube.com/watch?v=G76ONy6YAPQ">on youtube</a>.</p>

<!--more-->


<h2>Why Multi-Term</h2>

<p>I found <code>eshell</code> to be lacking terminal functionality. It didn't work well for me when trying to use a pager or using screen / tmux.  I chose <code>multi-term</code> because it runs a real terminal and has convenience functions for running multiple terminals, which matches my old workflow in iTerm2.</p>

<h2>Setup Problems</h2>

<p>The first problem I noticed was that <code>multi-term</code> would not display certain colors.  Inspecting <code>$TERM</code> in <code>multi-term</code> revealed that it was set to <code>eterm-color</code>, but my system lacked terminfo for that terminal.  The following command resolves this problem:</p>

<p><code>tic -o ~/.terminfo /Applications/Emacs.app/Contents/Resources/etc/e/eterm-color.ti</code></p>

<p>If your <code>Emacs.app</code> doesn't contain that file, you can try searching your system emacs install for <code>eterm-color.ti</code>.  That file has been included in emacs for many years.</p>

<p>Secondly, it's important to verify which <code>sh</code> multi-term is running against.  I prefer zsh.</p>

<div><script src='https://gist.github.com/rawsyntax/7293750.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7293750&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<p>I also noticed that my default zsh theme includes UTF-8 characters, which aren't displayed correctly by my emacs.  While I haven't found a fix for this, I have added a conditional to my <code>.zshrc</code> to use a more compatible theme inside emacs.</p>

<div><script src='https://gist.github.com/rawsyntax/7293807.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7293807&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<p>Another annoyance is that the default history limit is quite low (only 2048 lines).  If you are feeling lucky, you can set that value to 0, to have an unlimited terminal buffer.  However, you can bring your emacs to a crawl if you have a runaway process in your terminal.  I set mine to 10000 now and plan to increase it if performance is not a problem.</p>

<div><script src='https://gist.github.com/rawsyntax/7293989.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7293989&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<h2>Term Mode Customizations</h2>

<p>I have a couple minor-modes I'd like to turn off in <code>term-mode</code>.  A hook is provided for this purpose.</p>

<div><script src='https://gist.github.com/rawsyntax/7293879.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7293879&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<p>I run a couple different terminals with <code>multi-term</code>.  I tried the usual way of binding keys to cycle through terminals with <code>M-[</code> and <code>M-]</code>, but <code>local-set-key</code> and others didn't work.  After reading the <code>multi-term.el</code> source code, I found that <code>multi-term</code> handles key bindings using two lists: <code>term-unbind-key-list</code> and <code>term-bind-key-alist</code>.</p>

<div><script src='https://gist.github.com/rawsyntax/7293942.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7293942&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<p>I customize these with:</p>

<div><script src='https://gist.github.com/rawsyntax/7293933.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7293933&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<p>A note about buffer naming: <code>multi-term-next</code> and <code>multi-term-prev</code> require the terminal buffers to be named in a sequential way.  I tried renaming my terminal buffers and found that the bindings stop working.  Those commands simply implement or decrement the trailing number of the buffer name (e.g. <code>*terminal&lt;1&gt;*</code>).</p>

<p>I also found that yanking / pasting text into a terminal buffer didn't work.  This is frustrating but easily fixed.</p>

<div><script src='https://gist.github.com/rawsyntax/7294123.js'></script>
<noscript><pre><code>&lt;html&gt;&lt;body&gt;You are being &lt;a href=&quot;https://github.com/gist/7294123&quot;&gt;redirected&lt;/a&gt;.&lt;/body&gt;&lt;/html&gt;</code></pre></noscript></div>


<h2>Integration</h2>

<p>For ideas on how to integrate terminal actions into your emacs workflow see my <a href="http://rawsyntax.com/blog/learn-emacs-fit-your-workflow/">previous post</a>.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Living with Boxen]]></title>
<link href="http://rawsyntax.com/blog/living-with-boxen/"/>
<updated>2013-07-06T03:23:44-04:00</updated>
<id>http://rawsyntax.com/blog/living-with-boxen</id>
<category term="automation"/>

      <content type="html"><![CDATA[<p>About 3 months ago I switched to a new 15" retina macbook pro.  My previous OS X install was nearly 4 years old.  I did not want to clone the data over because too much cruft had built up.  I was left with the question of how to quickly and easily setup a laptop for programming work.  I chose <a href="http://boxen.github.com/">Boxen</a> because it was new, and I wanted a repeatable process for machine setup.</p>

<!--more-->


<h2>Promises</h2>

<p>By and large boxen delivers on its promises.  I was able to setup a system for ruby / web development in about 20 minutes (most of that was spent waiting). Simply</p>

<ul>
<li>Download and install XCode and CLI tools</li>
<li>Setup and run boxen.</li>
</ul>


<p>You get a system with rbenv and ruby installed and a bunch of other useful programs.</p>

<h2>Problems</h2>

<p>However, Boxen isn't perfect. It will require some customization sooner or later as you begin to use it for more tasks. This isn't a bad thing, but it requires you to get used to describing your machine configuration with code (Puppet).</p>

<h3>Default packages are for github</h3>

<div><script src='https://gist.github.com/rawsyntax/5940971.js'></script>
<noscript><pre><code></code></pre></noscript></div>


<p>The above section in the Puppetfile will install <a href="https://github.com/boxen/puppet-nginx">https://github.com/boxen/puppet-nginx</a> .  However this includes custom sites for the folks who work at github, which is not what I wanted. I elected to install nginx the old way <code>brew install nginx</code>, which gives me a vanilla nginx install.</p>

<h3>Homebrew location</h3>

<p>Boxen has its own homebrew installation at <code>/opt/boxen/homebrew/bin/brew</code>. This can be problematic for other tools that look for stuff installed into <code>/usr/local</code>.</p>

<h3>Separation</h3>

<p>Boxen keeps everything under <code>/opt/boxen</code>, which can cause problems with other tools. For example, Rails 2.3 looks for mysql sockets at <code>/tmp/mysql.sock</code> by default, whereas boxen creates the socket at <code>/opt/boxen/data/mysql/socket</code>.  These problems are easy to remedy (specify the socket path), but are stumbling blocks none the less.  Boxen's mysql also runs on an alternate port: <code>13306</code> not <code>3306</code>.</p>

<h2>Thinking in Boxen</h2>

<p>Boxen requires a change in user behavior. Now, when you make a change to your machine's configuration it should be done within boxen. It should be done in an idempotent way. The benefit here is that your customizations end up codified and versioned. So if you had to you could install your boxen on another machine and be ready to work in about 20 minutes.</p>

<h2>Peace of Mind</h2>

<p>Compute peacefully knowing your setup is versioned and repeatable. I now have scripts for setting up nearly every aspect of my machine. Furthermore, these steps now run faster than doing it manually.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: Store Window Configuration]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-store-window-configuration/"/>
<updated>2013-04-16T18:40:23-05:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-store-window-configuration</id>
<category term="learn-emacs"/>

      <content type="html"><![CDATA[<p>You may have seen my previous post on <a href="http://rawsyntax.com/blog/learn-emacs-fit-your-workflow/">Learn Emacs: Fit your Workflow</a>.  I've improved the function to bring up a full <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Frames.html">frame</a> eshell buffer, and restore back to previous window configuration with less code.  Previously I was using some complex keyboard macros to try to restore my specific usual frame setup.  This rewritten function will work for any frame setup.</p>

<div><script src='https://gist.github.com/rawsyntax/5400598.js'></script>
<noscript><pre><code></code></pre></noscript></div>


<p>I owe this tip to <a href="http://whattheemacsd.com/setup-magit.el-01.html">magnars' emacs configuration</a>.</p>

<p>More on <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Registers.html">registers here</a></p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: 24.3 released and NEWS]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-24-dot-3-released-and-news/"/>
<updated>2013-03-11T14:29:00-05:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-24-dot-3-released-and-news</id>
<category term="learn-emacs"/>

      <content type="html"><![CDATA[<p>Emacs 24.3 was released today.  If you're on OS X, the easiest way to check it out is by downloading a build from <a href="http://emacsformacosx.com/">EmacsForMacOSX</a>.</p>

<p>As for what's new in Emacs 24.3, in true Emacs fashion, we can ask it directly.</p>

<pre><code>M-x view-emacs-news
</code></pre>

<p>If you're using <a href="http://rawsyntax.com/blog/learn-emacs-smex/">Smex</a> M-x will suggest other view-emacs-* commands.</p>

<p>So next time you're wondering about how to do something in Emacs try asking it directly.</p>

<pre><code>M-x info-emacs-manual
</code></pre>

<p>Will view the Emacs manual as <a href="http://en.wikipedia.org/wiki/Info_(Unix)">info pages</a>.</p>
]]></content>
    </entry>
  
    <entry>
      




<title type="html"><![CDATA[Learn Emacs: Fit your Workflow]]></title>
<link href="http://rawsyntax.com/blog/learn-emacs-fit-your-workflow/"/>
<updated>2013-02-23T17:02:00-06:00</updated>
<id>http://rawsyntax.com/blog/learn-emacs-fit-your-workflow</id>
<category term="learn-emacs"/>

      <content type="html"><![CDATA[<div class="embed video YouTube"><iframe width="480" height="270" src="https://www.youtube.com/embed/nQ0Q_6HZwwY?feature=oembed" frameborder="0" allowfullscreen></iframe></div>


<p>The visor I refer to is a feature of <a href="http://totalterminal.binaryage.com/">TotalTerminal</a>.</p>

<!--more-->


<p>The elisp code is below:</p>

<div><script src='https://gist.github.com/rawsyntax/5021575.js'></script>
<noscript><pre><code></code></pre></noscript></div>




<div><script src='https://gist.github.com/rawsyntax/5021581.js'></script>
<noscript><pre><code></code></pre></noscript></div>



]]></content>
    </entry>
  
</feed>