Order of the state_machine callback chain

Callback order in state_machine matters when transitions depend on validation and persistence; aborting the chain can stop a transition from completing.

How to fix "Too many authentic authentication failures" with SSH and/or Capistrano

SSH or Capistrano connections can fail when ssh-agent offers too many keys and servers stop after repeated authentication attempts.

Why your all.js is empty on staging or production

When you include a non-existing Javascript file, you probably won't notice it during development. But with caching active (on production or staging) Rails will write an empty all.js file without complaining.

Slugs with FriendlyId

Gem to provide nice looking urls ("/blog/the-greatest-bug-i-never-fixed"). If you don't need anything too special (like i18n for the urls) it works as a drop-in-replacement. It basically overwrites #to_param to return the slug, and .find to search by the slug.

Make sure, everywhere you build paths, you use model_path(:id => model) instead of model_path(:id => model.id). You also need to adapt all code using something like .find_by_id. The regular .find is fine.

See the github README for installation instructions.

Don't forget ...

Copy a Paperclip attachment to another record

Reusing a Paperclip attachment on another record duplicates the file on save; a custom accessor can expose the original URL for form-based copying.

Force absolute URLs in views throughout a response

Relative view helpers generate path-only links and persistent asset hosts; enforcing full URLs needs separate handling for asset_host and rewrite_options.

Unobtrusive JavaScript and AJAX

AJAX-inserted content needs re-running jQuery behavior bindings; $.unobtrusive() scopes activation to new DOM nodes and activateUnobtrusiveJavascript() triggers it manually.

Javascript Compressor - compress code online for free

Reduce JavaScript source size and make code harder to read with a free online compressor for quick minification and obfuscation.

Highlighted prompt for production shells

Insert into ~/.bashrc and reload afterwards: source ~/.bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[41;33m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Apple iPhone Water Damage

Below are 12 easy steps to follow if you're iPhone has experienced water damage.

RubySpec - The Standard You Trust

RubySpec is a project to write a complete, executable specification for the Ruby programming language.

stefankroes's ancestry at master - GitHub

Ancestry is a gem/plugin that allows the records of a Ruby on Rails ActiveRecord model to be organised as a tree structure (or hierarchy). It uses a single, intuitively formatted database column, using a variation on the materialised path pattern. It exposes all the standard tree structure relations (ancestors, parent, root, children, siblings, descendants) and all of them can be fetched in a single sql query. Additional features are STI support, named_scopes, depth caching, depth constraints, easy migration from older plugins/gems, integrit...

Rethinking Rails 3 Controllers and Routes | Free PeepCode Blog

The Rails router has been written and rewritten at least four times2, including a recent rewrite for the upcoming Rails 3. The syntax is now more concise.<br />
<br />
But never mind making it shorter! It’s time for a final rewrite: Let’s get rid of it altogether!

Announcing the jQuery Mobile Project | jQuery Mobile

The jQuery project is really excited to announce the work that we’ve been doing to bring jQuery to mobile devices. Not only is the core jQuery library being improved to work across all of the major mobile platforms, but we’re also working to release a complete, unified, mobile UI framework.

Mule Design Studio’s Blog: Tips On Buying Design

You’re a business, calling a business, about conducting business. Don’t be surprised when money comes up.

Selling your software in China « Successful Software

The first thing I need to say, right off the bat: Chinese users will not buy your software. Period. That does not mean that there is no money to be made, it simply means that they will not pay for your software license.

Interoperability Happens - Death to Best Practices

Computer science is about tradeoffs and hard choices. Optimizing the code or design or architecture one way means taking hits another way.

jbarnette's johnson at master - GitHub

Johnson wraps JavaScript in a loving Ruby embrace. It embeds the Mozilla SpiderMonkey JavaScript runtime as a C extension.

mynyml's holygrail at master - GitHub

The Holy Grail of testing for front-end development; execute browser-less, console-based, javascript + DOM code right from within your Rails test suite.

pivotalexperimental's jazz_money at master - GitHub

Run your Jasmine specs without a browser

Use your singletons wisely: ten years later - The Code Whisperer

While injecting the dependency appeared to make the classes more tightly coupled, it simply revealed the coupling that already existed. A was already tightly coupled to B and B to C. When we tried to inject the dependency, we made that coupling more explicit and easier to remove.