This Week I Learned #2
How Ruby’s super
really works, DRYing out Heroku toolbelt commands, passing Ruby exceptions to blocks, and one weird tricks for making a robot voice speak my git commits.
In Ruby, super
Acts Like a Method
super
is one of those things I’d seen in Ruby but never knew quite what it does. I’d seen it used within methods to jump out and call the instance’s parent’s method of the same name. Indeed, it does that, but I learned this week that it actually returns with the result of that method, which opens up some interesting possibilties. This came in handy when I wanted to add a boolean method to a child model (e.g. Dachshund) that also took into account the result of the same method on the parent model (e.g. Dog):
class Dog
def cute?
weight < 20.pounds
end
end
class Dachshund < Dog
def cute?
super && length > 2.feet
end
end
Here, Dachshund#cute?
has its own truth conditions, but also respects the truth conditions of Dog#cute?
.
With the Heroku Toolbelt You Can Identify Apps by Git Remote Instead of Name
You use the -r
flag instead of -a
. So now I type:
$ heroku config -r staging
Instead of
$ heroku config -a stevegrossi-blog-staging
Not only does this usually save me a fair bit of typing (I type these commands dozens of times each day), but it helps make my code more modular. I often include a Rake task in my Rails apps that copies the production database to staging. I typically copy-and-paste this rake file into new apps and find-and-replace the relevant hard-coded Heroku app names. Now, I can just include something like:
task :update_staging => [:backup_staging, :backup_production] do
system 'heroku pgbackups:restore DATABASE -r staging $(heroku pgbackups:url -r production)'
end
And it’s good-to-go for any app. The only downside is that I can’t find a way to include the --confirm [APP NAME]
flag based on the Git remote, but I don’t mind having to manually enter that as a safety-check before wiping that database with an import.
In Ruby, Access the Exception when Rescuing with a Hashrocket
Here’s another one I’d seen but never needed to use until now:
begin
so_some_stuff
rescue DangerHighVoltageError => exception
notify(exception)
end
The hashrocket (=>
) here lets you access the exception instance within the rescue
block so you can act on it.
How to Make a Robot Speak Your Git Commits
This one’s entirely useless and a lot of fun (or maybe that’s just the end-of-day-Friday talking…) I learned this week about Git hooks, scripts that Git will run automatically as you use it. One of which is post-commit, which happens, you guessed it, after you commit. By creating an executable file in a Git repository at
$ touch .git/hooks/post-commit
$ chmod +x .git/hooks/post-commit
Git will execute that file after each commit you make. This file doesn’t implicitly know anything about the commit, but you can get the text of your last commit message with
$ git log -1 HEAD --pretty=format:%s
Combine that with Mac’s say
command and you have a Git hook that will read your commit message in a robot voice after each one: