Git diff a file with another revision (or branch)

Compare one file against another commit or branch to inspect changes without reviewing the entire repository.

Install a specific version of a gem

Pinning a gem version avoids accidental upgrades and keeps installs reproducible. gem install supports exact version selection with --version or -v.

Prevent Bundler from downloading the internet

As a user of Bundler you have spent significant time looking at this message:

Fetching source index for http://rubygems.org/

To make Bundler skip this index update and only use installed gems, you can use the --local option:

bundle install --local

Unfortunately this does not work with bundle update.

It is said that Bundler 1.1 will use a feature of Rubygems.org that allows partial index updates. Hopefully the wh...

Generate a Unicode nonbreaking space in Ruby

Regular spaces and non-breaking spaces look alike; a small Ruby helper can return the Unicode nonbreaking space instead of using HTML entities or raw character codes.

Defining and using sub-classes with modularity

Nested classes in modular traits can lose their original namespace, breaking references from class methods and other code. Using class self::Bar preserves the enclosing class name.

Install gems for all bundled projects

Batch-installs Ruby gems for every project in a directory, speeding up setup on a new system; native extensions still fail without required system dependencies.

Select a random table row with ActiveRecord

Randomly selecting a database row with ActiveRecord is possible, but ORDER BY RAND() scales poorly and can overload large tables.

Test that a CSS selector is present with Cucumber

Cucumber step for checking whether a CSS selector is present or absent on a page with Capybara or Webrat.

Bash Cheat Sheet (standard Emacs mode)

Handy Bash key bindings and history shortcuts reduce typing and speed up command-line editing, repetition, and reuse of previous arguments.

Rails 3 Remote Links and Forms: A Definitive Guide

Thanks to habits engrained by Rails 2’s link_to_remote and remote_form_for, we expect that Rails 3 would also handle the AJAX response for our remote links and forms. But it doesn’t; it leaves that for you.

Share your Internet connection under Ubuntu

Turn an Ubuntu PC into a simple internet gateway for another computer using a second network interface and connection sharing.

Terminus: a client-side Capybara driver

Terminus is a Capybara driver where most of the driver functions are implemented in client-side JavaScript. It lets you script any browser on any machine using the Capybara API, without any browser plugins or extensions.

Standalone Cucumber Test Suite

Sometimes you inherit a non Rails or non Rack based web app such as PHP, Perl, Java / JEE, etc. I like using cucumber for functional testing so I put together this project structure to use as a starting point for testing non Ruby web based applications.

Show a MySQL table's charset, collation and engine

SHOW CREATE TABLE reveals a table’s storage engine plus character set and collation, useful when comparing schemas or diagnosing encoding issues.

Request a non-HTML format in controller specs

Controller specs can exercise non-HTML responses such as PDF, Excel, XML or JSON by setting :format or the HTTP_ACCEPT header. The format value must be a String, not a Symbol.

Get the current layout's name in a view or partial

Retrieve the active view layout name, including its path, from response.layout; File.basename returns just the layout name when the full path is unnecessary.

Undocumented :inverse_of option for ActiveRecord associations

You can now add an :inverse_of option to has_one, has_many and belongs_to associations.... Without :inverse_of m and f.man would be different instances of the same object (f.man being pulled from the database again). With these new :inverse_of options m and f.man are the same in memory instance.

Enable or disable Gnome desktop icons

Desktop icons can distract during presentations; GNOME/Nautilus can hide or show them through the desktop preferences setting.

Fix LoadError with Rails 3 applications on Passenger

After switching to Rails 3 you may get a LoadError with the following message when trying to use your application via passenger:
no such file to load -- dispatcher

Your Passenger version is most likely out of date.

Update the gem, then install the apache module again:
sudo gem install passenger
sudo passenger-install-apache2-module

Follow any instructions. Update your /etc/apache2/httpd.conf with the lines given at the end of the installation process to use the version you just installed.

Passenger ignores RailsEnv directive for Rails 3 applications

You might find that your Passenger ignores all RailsSomething directives in the vhost for your new Rails 3 application. The culprit is a file config.ru which makes Passenger consider your application a Rack (non-Rails) application.

To fix this you can either use RackEnv in lieu of RailsEnv (it works fine) or delete the config.ru. Unless you have a good reason to do so, go with RackEnv.

Migrating to RSpec 2 from RSpec 1

Rails 3 requires rspec and rspec-rails 2, with renamed namespaces, changed requires, and macro extensions that may break during migration.

Take care when merging with params

Be careful when using params.merge as params is a HashWithIndifferentAccess.

Why?

Usually this should not be an issue but it turns crazy if you try to include associated models deeper than 1 level:
options = params.merge(:include => { :user => :avatar })
Post.paginate options

When inspecting the merged params you will get something like this:
{ :include=> { "user" => :avatar }, :page => 23 }

Here the :user symbol in the hash of inclusions turned into a "user"...

Use form_for without the enclosing form tag

Need form builder helpers without emitting a surrounding <form> tag, for partial updates such as XHR-driven field changes. Rails fields_for yields the same builder without hidden inputs or authenticity token.