Photo-1 Photo-2 Photo-3 Photo-4 Photo-5 Photo-6

@brentmc79

@brentmc79

Full-time web developer. Part-time smart ass.

I'm Brent Collier.

After a year and a half as an engineer on Twitter's Trust & Safety team, I'm looking for my next gig. Contact me if you know of something interesting.

#

Sass'd Bootstrap with Rails 3.1

Posted on 08/31/2011

Update: Sass'd Bootstrap Even better

bootstrap + sass

I saw Twitter's Bootstrap and thought it was awesome. Then I saw that somebody had ported Bootstrap over to SASS and I thought that was even more awesome. Finally, I thought hey let's crank the awesomeness up to 11 and use that sassy Bootstrap in my Rails 3.1 app.

It went something like this...

Clone the SASS fork of the Bootstrap repo

git clone https://github.com/jlong/sass-twitter-bootstrap.git

Then copy everything in the lib folder (scss files) over to your rails app.

cp sass-twitter/bootstrap/lib/*.scss path/to/railsapp/app/assets/stylesheets

By default Rails includes all of the file under the stylesheets directory, so I opened up railsapp.dev to see if it would magically work without any intervention on my part.

BOOM. Of course not.

Sass::SyntaxError: undefined variable: "$baseline".
    (in /path/to/railsapp/app/assets/stylesheets/forms.scss)

I figured it wouldn't be that easy, but it was worth a try. Clearly things weren't being required/included in the proper order which was leading to this undefined variable error. If you've used Rails 3.1 then you know that the vanilla application.css file contains a few "require" statements like so:

/*
 * This is a manifest file that'll automatically include all the stylesheets available in this directory
 * and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
 * the top of the compiled file, but it's generally better to create a new file per style scope.
 *= require_self
 *= require_tree . 
*/

Including everything in the stylesheets directory by default is nifty and all, but I prefer to explicitly include each of my stylesheets, so I removed require_treeand then explicitly required bootstrap. Since bootstrap.scss is nothing but @include statements for the other scss files, so it's the only one you need.

Once that's done, you should be good to go. Just refresh your browser and bask in its sassy, bootstrappy glory.

#

Pushing a Topic Branch to Heroku

Posted on 06/24/2011

This is one of those problems that I run into infrequently enough that I don't always immediately remember the answer. It usually happens when I'm working on a local topic branch and I try to push it to our staging instance on Heroku.

I push my code as usual, using

git push heroku master

Then I go to test my changes, and wtf? Its like nothing's changed at all. Then I usually try one or more of the follow things:

  • Doing a push with the --force option
  • Commiting some trivial whitespace-only change
  • Attempt to test any model-related changes via the console
  • Add a raise "boom" somewhere and commit/push, expecting an exception
  • Curse at the computer

Then, at some point, I remember that heroku always commits the master branch. Doh! No wonder I wasn't seeing any of my changes. So I reset head back to somewhere before all of the useless commits of the last 5 minutes, and then push my topic branch like so:

git push heroku branch_name:master

Suddenly everything works as intended and I no longer want to strangle kittens.

#

Override an AR default_scope

Posted on 06/08/2011

Say you've got a Thing class and your app uses soft deletes, so maybe you've got a default scope like so

default_scope where(:active => true)

and you want to find Thing records that have been (soft)deleted, so you try this

Thing.where(:active => false).all

which returns this

[]   #sadface

What gives?

Well, your default scope hold precedence over your where condition, so what you need to do is this

Thing.unscoped.where(:active => false).all

Using the unscoped scope returns an AR::Relation without the default scope, allowing you query for whatever you want. Enjoy.


Update

Or, as it turns out, you can create a scope that negates the default scope, like so

class Thing
  default_scope where(:active => true)
  scope :inactive, where(:active => false)
end
#

Using link_to in a controller *gasp*

Posted on 05/16/2011

Yeah, I know it kind of breaks the MVC pattern, but whatever. Its not something you'd want to do all the time, but in the rare instance that you'd like to generate an anchor tag from within a controller, try this:

ActionController.helpers.link_to("Click Me!", awesome_path)

Chances are, whatever you're doing could/should probably be moved into a helper method instead of doing it in the controller, but that's up to you.