Rails Raw SQL Insert -- Time Wrong

If the time is incorrect on something that you insert directly into the database when using Rails (off by several hours), try ensuring that you are using the correct modifier to get it into the right time zone. For example, instead of doing DateTime.now, try DateTime.now.utc if you are using UTC as your default timezone.

Converting ERB to Slim

I looked around and there was seemingly no easy way to convert Rails apps to use Slim instead of ERB. There was a gem out there, but it didn’t seem to work for me.

The general process I used was to first convert ERB to Haml using Haml’s haml2html. Next, convert Haml to Slim using haml2slim.

Convert ERB to Haml

Ensure you have Haml installed, preferably using your Gemfile if using Bundler. You can probably remove Haml when you are done with this process.

I got much inspiration from this article on the conversion process.

# to test what you will convert
find . -name '*html.erb' | \
xargs ruby -e 'ARGV.each { |i| puts "html2haml -r #{i} #{i.sub(/erb$/,"haml")}"}'

# to convert
find . -name '*html.erb' | \
xargs ruby -e 'ARGV.each { |i| puts "html2haml -r #{i} #{i.sub(/erb$/,"haml")}"}' | bash

Somewhere in this process the whitespace gets mostly stripped out. This is unfortunate, but should take less time overall to fix than converting over by hand.

Then, assuming you are using version control (not sure how much longer I will believe that this is not universal), remove the .erb files.

rm -rf "**/*.html.erb" # works in zsh at least...

This is important because Rails will look at your *.erb files first, so if you don’t delete them then the results of running html2haml won’t be seen.

Fix anything that is broken. In my case it was some illegal nesting and bad indentation problems in a couple of partials, as well as some other things that needed to be changed.

Look through the app in the browser if your tests don’t cover all of the views and for a sanity check. You may have to restart your server if you installed Haml.

Convert Haml to Slim

Ensure you have Slim installed, preferably using your Gemfile if using Bundler. Run gem install haml2slim (we don’t need this in the Gemfile since it’s for one-time use not in the application.)

Slim template files have the ending extension .slim, like their counterparts ERB (.erb) and Haml (.haml).

Again, we use a converter.

find . -name '*html.haml' | xargs ruby -e 'ARGV.each { |i| puts "haml2slim #{i} #{i.sub(/haml$/,"slim")}"}' | bash

Again, we delete the extra files (*/.html.haml this time).

Again, we fix anything that is broken.

Now hopefully your app should be fully converted to use Slim! Suddenly a puppy appears and the sun comes out from behind the clouds.

Bundler see what updates are available

The command to see what gems have more recent versions and can be updated is bundle outdated. This will show you all gems that could be upgraded, but unlike bundle update, will not actually update your gems (changing Gemfile.lock and installing new gems.)

It will output something like:

$ bundle outdated          
Updating git://github.com/panozzaj/andand.git
Fetching gem metadata from http://rubygems.org/.......
Fetching gem metadata from http://rubygems.org/..

Outdated gems included in the bundle:
  * ZenTest (4.6.2 > 4.5.0)
  * activesupport (3.1.1 > 3.0.9)
  * builder (3.0.0 > 2.1.2)
  * i18n (0.6.0 > 0.5.0)
  * activemodel (3.1.1 > 3.0.9)
  * erubis (2.7.0 > 2.6.6)
  * rack (1.3.4 > 1.2.4)
  * rack-mount (0.8.3 > 0.6.14)
  * rack-test (0.6.1 > 0.5.7)
  * actionpack (3.1.1 > 3.0.9)
  * mail (2.3.0 > 2.2.19)
  * actionmailer (3.1.1 > 3.0.9)
  * arel (2.2.1 > 2.0.10)
  * activerecord (3.1.1 > 3.0.9)
  * activeresource (3.1.1 > 3.0.9)
  * devise (1.4.2 2a5ad46 > 1.4.2 e76ba05)
  * railties (3.1.1 > 3.0.9)
  * rails (3.1.1 > 3.0.9)
  * sequel (3.28.0 > 3.20.0)
  * sinatra (1.3.1 > 1.0)

To break it down, “sinatra (1.3.1 > 1.0)” means that I have version 1.0 and version 1.3.1 is available.

Potential stumbling blocks

Getting a ‘Could not find task “outdated”.’ error message when trying to run bundle outdated?

At the time of this writing you need to have the right version of Bundler installed with gem install bundler --pre. This installs Bundler version 1.1.rc, which should also be much faster than earlier versions of Bundler. I would expect this portion of this post to be outdated in the near future.

Making Recommendations with Apache Mahout Presentation

Last month I gave a presentation about making recommendations with Apache Mahout. Since the presentation, Manning books has released the final version of their book, Mahout in Action, which should be an even better resource than the book that I was using for my slides and presentation. Here are the slides:

(Having trouble seeing the slides? Try here.)

Slim "Failure/Error: render ActionView::Template::Error: Unexpected end of file"

I was getting an error from Slim template saying:

Failure/Error: render
ActionView::Template::Error:
  Unexpected end of file
    my_file.html.slim, Line 15

, where the file had only 15 lines

I searched for the error and found:

# https://github.com/stonean/slim/blob/master/lib/slim/parser.rb
def parse_broken_line
  broken_line = @line.strip
  while broken_line[-1] == ?\\
    next_line || syntax_error!('Unexpected end of file')
    broken_line << "\n" << @line.strip
  end
  broken_line
end

What this means is that I had an extra trailing slash on one of the lines in a Slim escape that indicates that there are multiple lines. Slim was expecting another line, but didn’t see it and instead saw the end of the file. Removing the extra trailing slash fixed the problem.