Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Browse files

Updated some things, added another post.

  • Loading branch information...
commit 96a1cfc777ba599d9fce2ea6db6e8c75e4b6bfdc 1 parent 172b297
@mbleigh authored
3  _layouts/master.html
@@ -27,6 +27,9 @@
{{ content }}
+ <div id='footer'>
+ Copyright &copy; 2009 Michael Bleigh. Some rights reserved.
+ </div>
<script type="text/javascript">
(function() {
49 _posts/2009-01-28-has-avatar-defining-an-application-vocabulary.textile
@@ -0,0 +1,49 @@
+layout: post
+date: January 28, 2009
+title: "HasAvatar: Defining an Application Vocabulary"
+One of my favorite techniques to DRY up a Rails application is to pull out common functionality into a simple "vocabularized method," by which I mean a simple descriptive method call that can be made from within your model or controller definition. For instance, in some applications I might have multiple models that have an "avatar."
+These avatars all behave the same and should do the same things so I don't want to just repeat myself in the code. Instead I set up a file called <code>has_avatar.rb</code> inside my <code>config/initializers</code> folder. We use "Paperclip": for attachment handling at the moment, so I am going to create a wrapper for the specific Paperclip functionality I need for the avatars. Here's the code:
+<pre name="code" class="ruby">module HasAvatar
+ STYLES = { :large => ["200x200#", :png],
+ :medium => ["100x100#", :png],
+ :small => ["70x70#", :png],
+ :little => ["50x50#", :png],
+ :tiny => ["24x24#", :png] }
+ def self.included(base)
+ base.extend ClassMethods
+ end
+ module ClassMethods
+ def has_avatar
+ has_attached_file :avatar,
+ :styles => HasAvatar::STYLES,
+ :default_style => :medium,
+ :default_url => "",
+ :path => ":account/avatars/:class/:login/:style.:extension"
+ )
+ end
+ end
+ActiveRecord::Base.send :include, HasAvatar</pre>
+We define a module, <code>HasAvatar</code> that will add a new class method called <code>has_avatar</code> into whatever class it is included. I defined a constant <code>STYLES</code> that lets me access the style hash outside of the attachment definition. A final piece of DRYness in the code is the <code>PAPERCLIP_DEFAULTS</code> constant which is just the default setup for all attachments (S3 Bucket, etc.) and I override the options I need for the avatars by <code>merge</code>-ing them in.
+<pre name="code" class="ruby">class User < ActiveRecord::Base
+ has_avatar
+class Group < ActiveRecord::Base
+ has_avatar
+Now both users and groups will have all of the expected Paperclip functionality without having to repeat ourselves. This is a simple example but it shows the general practices behind building your *application vocabulary*, which is just my made-up term for the abstract reusable components that are specific only to this application. Of course, if it's useful outside of the application, you might want to just go ahead and pluginize it!
+The usefulness of these abstracted methods also comes in through the inherently polymorphic nature of Ruby. Throughout my code I can write helpers, views and more to support avatars without caring whether the object in question is a <code>User</code> or a <code>Group</code>. Basically, the DRYer you start the DRYer you stay.
6 about.textile
@@ -9,4 +9,8 @@ Michael Bleigh is the author of this blog as well as a Rubyist, designer, and op
Michael has contributed a number of open-source projects to the Ruby community including the "SubdomainFu": and "ActsAsTaggableOn": plugins for Rails. He was also chosen to speak at RailsConf Europe 2008 as well as the Great Lakes Ruby Bash in 2008.
-His work at Intridea has included being the product manager and technical lead for "":, the business micro-communications platform launched in September of 2008.
+His work at Intridea has included being the product manager and technical lead for "":, the business micro-communications platform launched in September of 2008.
+h2. About This Site
+This site is built using the "Jekyll": library and hosted on "GitHub": The source code used to create this library is "publicly available on GitHub": as well.
6 blog.html
@@ -1,11 +1,11 @@
layout: master
title: Blog
-full_posts: 4
+full_posts: 5
{% for post in site.posts %}
- {% if forloop.index <= page.full_posts %}
+ {% if forloop.index < page.full_posts %}
<div class='post'>
<span class='date'>{{}}</span>
<h1><a href='{{post.url}}'>{{post.title}}</a></h1>
@@ -13,7 +13,7 @@
<a href='{{post.url}}#disqus_thread'>View Comments</a>
{% else %}
- {% if forloop.index == page.full_posts + 1 %}
+ {% if forloop.index == page.full_posts %}
<h3>Older Posts</h3>
<table class='post-list'>
{% endif %}
6 open-source.html
@@ -3,4 +3,8 @@
title: Open-Source Projects
+<ul id='open-source-projects'>
Please sign in to comment.
Something went wrong with that request. Please try again.