<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2enclosuresfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:media="http://search.yahoo.com/mrss/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title />
    <link>http://www.dotnetguy.co.uk</link>
    <description />
    
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/DanWatsonsWorldOfWeb" /><feedburner:info uri="danwatsonsworldofweb" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><itunes:explicit>no</itunes:explicit><itunes:subtitle></itunes:subtitle><item>
      <title>Install Gimp 2.8 On Ubuntu 12.04</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/a3O7m0SD9sc/</link>
      <description>&lt;p class="article-ad"&gt;
&lt;script type="text/javascript"&gt;&lt;!–
google_ad_client = "ca-pub-2572510391392932";
/* dotnetguyuk-article */
google_ad_slot = "5435600851";
google_ad_width = 250;
google_ad_height = 250;
//–&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/p&gt;


&lt;p&gt;&lt;img src="http://dotnetguyuk.s3.amazonaws.com/gimp.png" alt="gimp screenshot" /&gt;&lt;/p&gt;

&lt;br /&gt;


&lt;p&gt;Here is a quick and easy way to install the new release of Gimp 2.8 on Ubuntu. One of the great new features of this release is you can now work in a single window rather than multiple windows. To activate single window mode just go to the tool bar and select window -&gt; Single-Window mode, this is just one of the many new features with this release.&lt;/p&gt;

&lt;h4&gt;Release notes for the latest 2.8.2&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Mention that the image was exported in the close warning dialog&lt;/li&gt;
&lt;li&gt;Fix the visibility logic of the export/overwrite menu items&lt;/li&gt;
&lt;li&gt;Remove all &amp;#8220;Use GEGL&amp;#8221; menu items, they only add bugs and zero function&lt;/li&gt;
&lt;li&gt;Improve performance of display filters, especially color management&lt;/li&gt;
&lt;li&gt;Fix the image window title to comply with the save/export spec and use the same image name everywhere, not only in the title&lt;/li&gt;
&lt;li&gt;Fix positioning of pasted/dropped stuff to be more reasonable&lt;/li&gt;
&lt;li&gt;Fix remembering of JPEG load/save defaults&lt;/li&gt;
&lt;li&gt;Lots of bug fixes&lt;/li&gt;
&lt;li&gt;List of translation updates&lt;/li&gt;
&lt;/ul&gt;


&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt;sudo apt-get autoremove gimp gimp-plugin-registry
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;sudo add-apt-repository ppa:otto-kesselgulasch/gimp
&lt;/span&gt;&lt;span class=’line’&gt;sudo apt-get update
&lt;/span&gt;&lt;span class=’line’&gt;sudo apt-get install gimp
&lt;/span&gt;&lt;span class=’line’&gt;sudo apt-get install gimp-plugin-registry&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/a3O7m0SD9sc" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/10/04/install-gimp-2-dot-8-on-ubuntu-12-dot-04/</guid>
      <pubDate>2012-10-04 22:02:00 +0100</pubDate>
      <category term="gimp ubuntu" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/10/04/install-gimp-2-dot-8-on-ubuntu-12-dot-04/</feedburner:origLink></item>
    
    <item>
      <title>Rails - Rspec - Testing Your Modules</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/o2C3mXYXSKU/</link>
      <description>&lt;div&gt;
&lt;p class="article-ad"&gt;
&lt;script type="text/javascript"&gt;&lt;!–
google_ad_client = "ca-pub-2572510391392932";
/* dotnetguyuk-article */
google_ad_slot = "5435600851";
google_ad_width = 250;
google_ad_height = 250;
//–&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/p&gt;
&lt;p&gt; 
I have been working on a project recently where modules are used extensively to share behaviour between model classes. I was looking to use an example from the system but they were all overly complex and detracted from the subject - testing modules. So in the following contrived example I will show you how to test the behavior of a module using rspec.

The following &amp;#8220;Pointless&amp;#8221; module adds a class method which will scramble a class name&amp;#8230;. doesn&amp;#8217;t get more pointless than that!
&lt;/p&gt;
&lt;/div&gt;


&lt;div class="cb"&gt;&lt;/div&gt;


&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Pointless&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kp"&gt;extend&lt;/span&gt; &lt;span class="no"&gt;ActiveSupport&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Concern&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ClassMethods&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;scrambled_class_name&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="no"&gt;Digest&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MD5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Below the module is mixed into two active record classes.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Post&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Pointless&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;




&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Comment&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ActiveRecord&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Pointless&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;When testing modules I tend to add a folder under the spec directory called modules. I then use the shared_examples_for group and define specs within the block. When calling described_class it returns the class that the module has been mixed into within the current it_behaves_like context.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;spec/modules/pointles_spec.rb&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;spec_helper&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;shared_examples_for&lt;/span&gt; &lt;span class="no"&gt;Pointless&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;context&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;class methods&amp;quot;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;should be able to scramble the class name using md5&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="n"&gt;described_class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;scrambled_class_name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;should&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="no"&gt;Digest&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;MD5&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;described_class&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;Post&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;it_behaves_like&lt;/span&gt; &lt;span class="no"&gt;Pointless&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="n"&gt;describe&lt;/span&gt; &lt;span class="no"&gt;Comment&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;it_behaves_like&lt;/span&gt; &lt;span class="no"&gt;Pointless&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It&amp;#8217;s then just a matter of using describe for each class the module has been mixed into and call it_behaves_like Module, then the specs for the module will be run in the context of the class.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/o2C3mXYXSKU" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/08/26/rails-rspec-testing-your-modules/</guid>
      <pubDate>2012-08-26 00:00:00 +0100</pubDate>
      <category term="modules rails rspec ruby testing" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/08/26/rails-rspec-testing-your-modules/</feedburner:origLink></item>
    
    <item>
      <title>Ruby Development Quick Tip - Use The ssh-forever Gem - Stop Typing Your SSH Passwords</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/3-FIUKYtfmw/</link>
      <description>&lt;p class="article-ad"&gt;
&lt;script type="text/javascript"&gt;&lt;!–
google_ad_client = "ca-pub-2572510391392932";
/* dotnetguyuk-article */
google_ad_slot = "5435600851";
google_ad_width = 250;
google_ad_height = 250;
//–&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/p&gt;


&lt;p&gt;I just wanted to share a quick tip. A friend of mine asked why when using SSH does it not ask me for my password.&lt;/p&gt;

&lt;p&gt;The quick answer is I use the &lt;a href="https://github.com/mattwynne/ssh-forever/" target="_blank"&gt;ssh-forever&lt;/a&gt; gem.&lt;/p&gt;

&lt;p&gt;By using this gem you only have to input your SSH passwords once and then they will be remembered for all future SSH connections (which is great when using deployment tools like capistrano or vlad - as you don&amp;#8217;t want to keep entering your password everytime you deploy).&lt;/p&gt;

&lt;p&gt;Firstly install the gem.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt; (if you are using rvm - install it in the global gemset)
&lt;/span&gt;&lt;span class=’line’&gt; rvm use gemset global
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt; gem install ssh-forever&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Then its as simple as&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=”&gt;&lt;span class=’line’&gt; ssh-forever root@myserver.net &lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You will be prompted to enter you SSH password for the last time. Future connections made will not require a password when connecting from your machine.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/3-FIUKYtfmw" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/08/21/ruby-development-quick-tip-use-the-ssh-forever-gem-stop-typing-your-ssh-passwords/</guid>
      <pubDate>2012-08-21 16:45:00 +0100</pubDate>
      <category term="development linux ruby ssh" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/08/21/ruby-development-quick-tip-use-the-ssh-forever-gem-stop-typing-your-ssh-passwords/</feedburner:origLink></item>
    
    <item>
      <title>Ruby Nested Hash - Deep Fetch - Returning a (default) value for a key that does not exist in a nested hash</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/rUPMe_Z35p8/</link>
      <description>&lt;p class="article-ad"&gt;
&lt;script type="text/javascript"&gt;&lt;!–
google_ad_client = "ca-pub-2572510391392932";
/* dotnetguyuk-article */
google_ad_slot = "5435600851";
google_ad_width = 250;
google_ad_height = 250;
//–&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/p&gt;


&lt;p&gt;Ok so this is a follow on post for &lt;a href="/post/2012/08/19/ruby-hash-fetch-returning-a-value-for-a-key-that-does-not-exist/" target="_blank"&gt;Ruby Hash - Fetch - Returning a (Default) Value for a Key That Does Not Exist&lt;/a&gt; which I wrote yesterday.&lt;/p&gt;

&lt;p&gt;Basically I found that you can use the fetch method on a hash to either retrieve a value for a key or return a specified value. In the posts comments someone mentioned that it was useless for nested hashes, which is true. It turns out that it is not that hard to implement the behaviour of fetch for fetching a nested key / value pair.&lt;/p&gt;

&lt;p&gt;For this I have added a few methods to the Hash class (if your using rails you could make this an initializer). The deep_fetch method will behave exactly the same as fetch but search the hash at all levels for a keys value.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;   &lt;span class="n"&gt;default&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;block_given?&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;   &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;deep_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="no"&gt;KeyError&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;key not found: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;deep_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;memo&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:deep_find&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Here is an example of a nested hash we are going to work with.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:search&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Search Term&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:order&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:desc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:extra&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:user&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:uid&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;12345&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;}}}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It will find a keys value at the first level of the hash (this is the same behaviour as fetch).&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:search&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; &amp;quot;Search Term&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;If no default value is passed as the second argument a KeyError will be raised if the key is not found (this is the same behaviour as fetch).&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:no_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; &amp;quot;KeyError: key not found no_key&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It will return a default value for a key that does not exist if the default argument is passed to the method.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:no_key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:my_value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; :my_value&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It can accept a block for calculated default values.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:no_key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 10&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;It can fetch a value for a deeply nested key.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; { :uid =&amp;gt; 12345 }&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;deep_fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:uid&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 12345&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/rUPMe_Z35p8" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/08/20/ruby-nested-hash-deep-fetch-returning-a-default-value-for-a-key-that-does-not-exist-in-a-nested-hash/</guid>
      <pubDate>2012-08-20 18:33:00 +0100</pubDate>
      <category term="hash ruby" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/08/20/ruby-nested-hash-deep-fetch-returning-a-default-value-for-a-key-that-does-not-exist-in-a-nested-hash/</feedburner:origLink></item>
    
    <item>
      <title>Ruby Hash - Fetch - Returning a (default) value for a key that does not exist</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/htoJZuS993U/</link>
      <description>&lt;p&gt;I was looking at some ruby code I wrote a few days ago and something didn&amp;#8217;t sit right with me. I had a bit of a code smell when
setting a default value for a hash key if the key didn&amp;#8217;t exist.&lt;/p&gt;

&lt;p&gt;The scenario&amp;#8230; there is a hash that has a search key which holds information for a search term, optionally the order key may be set also.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;  &lt;span class="nb"&gt;hash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:search&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ruby hashes&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Initially when the order key had not been set I would perform a check to see if they key existed then using the ternary operator set  a default value. I think it looks a bit ugly though!&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;key?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:order&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:order&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="ss"&gt;:desc&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;How have I not heard of the fetch method before? Fetch takes a key argument which will be used to look up the key in the hash, optionally it takes a second parameter which is the value to return if the key has not been set.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:order&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:desc&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;A small refactor which I think looks much nicer. This may be obvious to some, but it was one of those methods I had just never used!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/htoJZuS993U" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/08/19/ruby-hash-fetch-returning-a-value-for-a-key-that-does-not-exist/</guid>
      <pubDate>2012-08-19 18:29:00 +0100</pubDate>
      <category term="hash ruby" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/08/19/ruby-hash-fetch-returning-a-value-for-a-key-that-does-not-exist/</feedburner:origLink></item>
    
    <item>
      <title>Rails ActiveRecord - Batch Updates</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/avFJZVL_Mz8/</link>
      <description>&lt;p&gt;I am currently writing an application that requires a high level of performace. This means that every line of code written has to be scrutinised and performace tested. I am finding myself needing to take a different approach for the simplist of code in order to squeeze out every last drop of speed.&lt;/p&gt;

&lt;p&gt;Imagine you need to update an attribute on a collection of items.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;  &lt;span class="no"&gt;Tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:is_featured&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_attribute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:is_featured&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;This is bad for a few of reasons. Firstly we have to load each record into memory and secondly a seperate update statement is fired for every record updated. If there are lots of records your application will feel the performance hit.&lt;/p&gt;

&lt;p&gt;If you want to do this in one single sql call it can be done using the &lt;a href="http://apidock.com/rails/ActiveRecord/Base/update_all/class" target="_blank"&gt;update_all&lt;/a&gt; method.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;  &lt;span class="no"&gt;Tag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;update_all&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="ss"&gt;:is_featured&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;false&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="ss"&gt;:is_featured&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The first argument are the attributes to update and the second is the filter conditions for the query. So for the case in hand the sql generated will be.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’sql’&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;is_featured&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt;&lt;span class="n"&gt;is_featured&lt;/span&gt;&lt;span class="o"&gt;`&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;The only drawback to this is that you model callbacks will not be triggered, but luckily in my case this is not an issue.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/avFJZVL_Mz8" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/08/01/rails-active-record-batch-updates/</guid>
      <pubDate>2012-08-01 22:09:00 +0100</pubDate>
      <category term="activerecord performance rails" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/08/01/rails-active-record-batch-updates/</feedburner:origLink></item>
    
    <item>
      <title>Devise - Omniauth - Facebook - Getting Extra Permissions</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/gYH2Z2McX8Q/</link>
      <description>&lt;p class="article-ad"&gt;
&lt;script type="text/javascript"&gt;&lt;!–
google_ad_client = "ca-pub-2572510391392932";
/* dotnetguyuk-article */
google_ad_slot = "5435600851";
google_ad_width = 250;
google_ad_height = 250;
//–&gt;
&lt;/script&gt;
&lt;script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js"&gt;
&lt;/script&gt;
&lt;/p&gt;


&lt;p&gt;When using devise and omniauth for authentication sometimes you need to require more permissions from facebook. This is useful when you want to later use the authentication code from facebook do such things as posting to the users wall (I recommend the &lt;a href="https://github.com/arsduo/koala/"&gt;Koala Gem&lt;/a&gt; for this).&lt;/p&gt;

&lt;p&gt;Within the devise config you will probably already have your facebook omniauth provider setup. After passing the secret key you just need to pass a scope requesting the additional permissions required for your application.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;config/initializers/devise.rb&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;omniauth&lt;/span&gt; &lt;span class="ss"&gt;:facebook&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;app_id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;secret_key&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;:scope&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;publish_stream, offline_access, email&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;When your user is now setup or authorized from facebook make sure you save the code parameter against the user, this is passed back to your omniauth callbacks controller. Here is an example of mine below.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;app/controllers/users/omniauth_callbacks_controller.rb&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Users&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;OmniauthCallbacksController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Devise&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;OmniauthCallbacksController&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;   &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Devise&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Controllers&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rememberable&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;   &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;facebook&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;     &lt;span class="vi"&gt;@user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;configure_facebook_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;omniauth.auth&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:code&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;     &lt;span class="n"&gt;remember_me&lt;/span&gt; &lt;span class="vi"&gt;@user&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;     &lt;span class="n"&gt;sign_in_and_redirect&lt;/span&gt; &lt;span class="vi"&gt;@user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:event&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:authentication&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;   &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Also below I have included my class methods from my user model that takes care of saving the user (I hope this helps someone).&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;span class=’line-number’&gt;18&lt;/span&gt;
&lt;span class=’line-number’&gt;19&lt;/span&gt;
&lt;span class=’line-number’&gt;20&lt;/span&gt;
&lt;span class=’line-number’&gt;21&lt;/span&gt;
&lt;span class=’line-number’&gt;22&lt;/span&gt;
&lt;span class=’line-number’&gt;23&lt;/span&gt;
&lt;span class=’line-number’&gt;24&lt;/span&gt;
&lt;span class=’line-number’&gt;25&lt;/span&gt;
&lt;span class=’line-number’&gt;26&lt;/span&gt;
&lt;span class=’line-number’&gt;27&lt;/span&gt;
&lt;span class=’line-number’&gt;28&lt;/span&gt;
&lt;span class=’line-number’&gt;29&lt;/span&gt;
&lt;span class=’line-number’&gt;30&lt;/span&gt;
&lt;span class=’line-number’&gt;31&lt;/span&gt;
&lt;span class=’line-number’&gt;32&lt;/span&gt;
&lt;span class=’line-number’&gt;33&lt;/span&gt;
&lt;span class=’line-number’&gt;34&lt;/span&gt;
&lt;span class=’line-number’&gt;35&lt;/span&gt;
&lt;span class=’line-number’&gt;36&lt;/span&gt;
&lt;span class=’line-number’&gt;37&lt;/span&gt;
&lt;span class=’line-number’&gt;38&lt;/span&gt;
&lt;span class=’line-number’&gt;39&lt;/span&gt;
&lt;span class=’line-number’&gt;40&lt;/span&gt;
&lt;span class=’line-number’&gt;41&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;facebook_config&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="no"&gt;YAML&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/config/facebook.yml&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;facebook_client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;   &lt;span class="no"&gt;Koala&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Facebook&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;API&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;access_token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;configure_facebook_user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:email&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:first_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:last_name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:gender&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Gender&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gender&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_sym&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:date_of_birth&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:location&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hometown&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:about&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;extra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;raw_info&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bio&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                       &lt;span class="ss"&gt;:password&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Devise&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;friendly_token&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                      &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Role&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:member&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;role&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;begin&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;facebook_oauth_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_access_token&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;code&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;rescue&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="c1"&gt;#External api call rescue all!&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;provider&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;authorisation_hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;uid&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;confirm!&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;remember_me!&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="n"&gt;user&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;facebook_oauth_client&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="no"&gt;Koala&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Facebook&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;OAuth&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;facebook_config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;app_id&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                             &lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;facebook_config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;secret_key&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;                             &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;User&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;facebook_config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;callback&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/users/auth/facebook/callback&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/gYH2Z2McX8Q" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/07/18/devise-omniauth-facebook-getting-extra-permissions/</guid>
      <pubDate>2012-07-18 23:16:00 +0100</pubDate>
      <category term="devise facebook omniauth rails ruby" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/07/18/devise-omniauth-facebook-getting-extra-permissions/</feedburner:origLink></item>
    
    <item>
      <title>Octopress - Category List Plug-in</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/xwSoY2I-FDs/</link>
      <description>&lt;p&gt;I have just switched two blogs over to use &lt;a href="http://octopress.org"&gt;Octopress&lt;/a&gt;, both &lt;a href="http://www.dotnetguy.co.uk"&gt;dotnetguy.co.uk&lt;/a&gt; and also &lt;a href="http://paz.am/blog"&gt;paz.am/blog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;One thing that was missing &amp;#8220;out of the box&amp;#8221; was the ability to include a list of categories in the sidebar with a link. Fortunately Octopress (well actually Jekyll) is written in such away that creating a plug-in to do this is very simple.&lt;/p&gt;

&lt;p&gt;Firstly we need to write a little ruby code. Add a file to the plugins directory called category_list_tag.rb. This plug-in will take the category data from the site and generate list items for each category. On line 17 the category_list tag is then registered and made available to the liquid templating engine.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;category_list_tag.rb&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;span class=’line-number’&gt;7&lt;/span&gt;
&lt;span class=’line-number’&gt;8&lt;/span&gt;
&lt;span class=’line-number’&gt;9&lt;/span&gt;
&lt;span class=’line-number’&gt;10&lt;/span&gt;
&lt;span class=’line-number’&gt;11&lt;/span&gt;
&lt;span class=’line-number’&gt;12&lt;/span&gt;
&lt;span class=’line-number’&gt;13&lt;/span&gt;
&lt;span class=’line-number’&gt;14&lt;/span&gt;
&lt;span class=’line-number’&gt;15&lt;/span&gt;
&lt;span class=’line-number’&gt;16&lt;/span&gt;
&lt;span class=’line-number’&gt;17&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’ruby’&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Jekyll&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CategoryListTag&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Liquid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Tag&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="n"&gt;categories&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;registers&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:site&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="n"&gt;posts_in_category&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;registers&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:site&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;categories&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="n"&gt;category_dir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;registers&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:site&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;category_dir&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="n"&gt;category_url&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;category_dir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/_|\P{Word}/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/-{2,}/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;downcase&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;        &lt;span class="n"&gt;html&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;li class=&amp;#39;category&amp;#39;&amp;gt;&amp;lt;a href=&amp;#39;/&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;category_url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&amp;#39;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;category&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; (&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;posts_in_category&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;)&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;      &lt;span class="n"&gt;html&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="no"&gt;Liquid&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Template&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;register_tag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;category_list&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;Jekyll&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;CategoryListTag&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now we need to create the category list (category_list.html) template in source/_includes/asides. We now use the &amp;#8220;category_list&amp;#8221; tag we registered in the plug-in above.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;category_list.html&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;span class=’line-number’&gt;2&lt;/span&gt;
&lt;span class=’line-number’&gt;3&lt;/span&gt;
&lt;span class=’line-number’&gt;4&lt;/span&gt;
&lt;span class=’line-number’&gt;5&lt;/span&gt;
&lt;span class=’line-number’&gt;6&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’html’&gt;&lt;span class=’line’&gt;&lt;span class="nt"&gt;&amp;lt;section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;lt;h1&amp;gt;&lt;/span&gt;Categories&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;categories&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;    {% category_list %}
&lt;/span&gt;&lt;span class=’line’&gt;  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;span class=’line’&gt;&lt;span class="nt"&gt;&amp;lt;/section&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Finally we just need to add the new sidebar template to the default_asides configuration within the _config.yml.&lt;/p&gt;

&lt;figure class=’code’&gt;&lt;figcaption&gt;&lt;span&gt;_config.yml&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class=’line-number’&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class=’code’&gt;&lt;pre&gt;&lt;code class=’yaml’&gt;&lt;span class=’line’&gt;&lt;span class="l-Scalar-Plain"&gt;default_asides&lt;/span&gt;&lt;span class="p-Indicator"&gt;:&lt;/span&gt; &lt;span class="p-Indicator"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;asides/category_list.html&lt;/span&gt;&lt;span class="p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;asides/recent_posts.html&lt;/span&gt;&lt;span class="p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;asides/twitter.html&lt;/span&gt;&lt;span class="p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;asides/delicious.html&lt;/span&gt;&lt;span class="p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;asides/pinboard.html&lt;/span&gt;&lt;span class="p-Indicator"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;asides/googleplus.html&lt;/span&gt;&lt;span class="p-Indicator"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And that&amp;#8217;s all she wrote! I think Octopress / Jekyll is an excellent blog engine / static site generator, and being able to hack away and write simple plug-ins quickly makes it my number one choice&amp;#8230; for now.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/xwSoY2I-FDs" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2012/06/25/octopress-category-list-plugin/</guid>
      <pubDate>2012-06-25 19:18:00 +0100</pubDate>
      <category term="octopress ruby" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2012/06/25/octopress-category-list-plugin/</feedburner:origLink></item>
    
    <item>
      <title>Introducing Kue - A Rails Ready Key Value Store That Uses ActiveRecord Under The Hood</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/JNGjkXTy7w0/</link>
      <description>&lt;p&gt;
A few weeks ago I wrote a post on how I had implemented a &lt;a href="http://www.dotnetguy.co.uk/post/2011/12/03/activerecord-simple-key-value-store" title="ActiveRecord - Simple Key Value Store" target="_blank"&gt;simple key value store using activerecord&lt;/a&gt;.
&lt;/p&gt;




&lt;p&gt;
I received a lot of feedback not only via the comment&amp;#8217;s on the post but also by email.
As so many people showed interest I decided to create an activerecord backed key value store gem called &lt;a href="https://github.com/dotnetguyuk/kue" title="Kue @ Github" target="_blank"&gt;kue&lt;/a&gt; encompassing some of the idea&amp;#8217;s and thought&amp;#8217;s that people had brought to my attention.
&lt;/p&gt;




&lt;p&gt;
Getting setup with kue is easy as it has a rails generator to copy over the migration needed in order to setup the underlying key
value storage table.
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
rails generate kue:install
rake db:migrate
&lt;/pre&gt;




&lt;p&gt;
When you want to set or retrieve any arbitrary keys value then you can do so by calling on the KueStore class.
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
#Set the value of the key
KueStore[:any_key_name_you_can_think_of] = "Any object you can dream up"
#Retrieve the value of the key 
KueStore[:any_key_name_you_can_think_of] 
&lt;/pre&gt;




&lt;p&gt;
There is also a helper method to check if a key already exists.
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
KueStore.exists?(:my_class_instance)
&lt;/pre&gt;




&lt;p&gt;
One of the nice things about kue is it can store any object you can think of complex or simple!
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
 KueStore[:my_class_instance] = Foo.new(:name =&gt; 1)
&lt;/pre&gt;




&lt;p&gt;
Let me know what you think. Pull requests are always welcome!
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/JNGjkXTy7w0" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2011/12/24/introducing-kue-a-rails-ready-key-value-store-that-uses-activerecord-under-the-hood/</guid>
      <pubDate>2011-12-24 00:00:00 +0000</pubDate>
      <category term="activerecord kue ruby" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2011/12/24/introducing-kue-a-rails-ready-key-value-store-that-uses-activerecord-under-the-hood/</feedburner:origLink></item>
    
    <item>
      <title>ActiveRecord STI - How To Prevent The Base Class Being Saved.</title>
      <link>http://feedproxy.google.com/~r/DanWatsonsWorldOfWeb/~3/iuY6VL1Tsqk/</link>
      <description>&lt;p&gt;
When using ActiveRecord and Single Table Inheritance sometimes it may not be desirable to have the base class ever persisted to the database, which by default is able to occur.
&lt;/p&gt;




&lt;p&gt;
In the following contrived example we can see that we have an animal base class as well as dog and cat classes that inherit from animal.
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
class Animal &lt; ActiveRecord::Base
  
end

class Dog &lt; Animal
  
end


class Cat &lt; Animal
  
end
&lt;/pre&gt;




&lt;p&gt;
Here is the migration that is used back these objects. Take note of the type column. The type column will be saved with the name
of the class, in this case either Dog or Cat depending on which type of object is being persisted.
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
create_table :animals, :force =&gt; true do |t|
  t.string   :name
  t.string   :type
end
&lt;/pre&gt;




&lt;pre class="prettyprint"&gt;
Animal.create(:name =&gt; "Fido")
=&gt; #&lt;Animal id: 6, name: "Fido", type: nil&gt; 
&lt;/pre&gt;




&lt;p&gt;
As the example above shows the Animal class is able to be saved to the database. 
This may not be particularly desirable (dependant on requirements) as you may want to lock down your model so only the inherited classes can be persisted (in this case Dog or Cat).
&lt;/p&gt;




&lt;p&gt;So how do we stop this?&lt;/p&gt;




&lt;p&gt;Firstly make sure you application loads the following folder by adding app/modules to your autoload_paths in your application.rb&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
module ApplicationName
  class Application &lt; Rails::Application
    config.autoload_paths += %W(#{config.root}/app/modules)
  end
end
&lt;/pre&gt;




&lt;p&gt;Then add the following folder structure to your applications app folder.&lt;/p&gt;




&lt;pre&gt;
–app
—modules
—-active_record
—–extensions
——-abstract_class.rb
&lt;/pre&gt;




&lt;p&gt;In the abstract_class.rb file add the following code. This is a module that extends ActiveSupport::Concern.&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
module ActiveRecord
  module Extensions
    module AbstractClass
      extend ActiveSupport::Concern
      
      included do
        before_save :abstract_class?
      end
  
      def abstract_class?
        raise "Do not try to save #{self.class} as it is an abstract class" if self.read_attribute(:type).nil?
      end
    end
  end
end
&lt;/pre&gt;




&lt;p&gt;
Using the module and including it into any base class (in this case Animal) will stop it from ever being able to be persisted to the database. 
It works because the base class is never saved with a type so we are able to check for this and then throw an error if necessary.
&lt;/p&gt;




&lt;pre class="prettyprint"&gt;
class Animal &lt; ActiveRecord::Base
  include ActiveRecord::Extensions::AbstractClass
end
&lt;/pre&gt;




&lt;pre class="prettyprint"&gt;
Animal.create(:name =&gt; "Fido")
RuntimeError: Do not try to save Animal as it is an abstract class
&lt;/pre&gt;




&lt;p&gt;
I really like this kind of model level constraint as it locks down your data API for other developers you share code with, without the need for too much documentation or explanation.
&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/DanWatsonsWorldOfWeb/~4/iuY6VL1Tsqk" height="1" width="1"/&gt;</description>
      <guid isPermaLink="false">http://www.dotnetguy.co.uk/post/2011/12/03/activerecord-sti-how-to-prevent-the-base-class-being-saved/</guid>
      <pubDate>2011-12-03 00:00:00 +0000</pubDate>
      <category term="activerecord ruby rubyonrails" />
    <feedburner:origLink>http://www.dotnetguy.co.uk/post/2011/12/03/activerecord-sti-how-to-prevent-the-base-class-being-saved/</feedburner:origLink></item>
    
  <language>en-us</language><media:rating>nonadult</media:rating></channel>
</rss>
