---
title: Do End Your Braces
teaser:
tags: web,ruby,testing
author: Mike Burns
published_on: 2012-03-19
---

Braces and `do`/`end` are completely
swappable&mdash;almost all the time. They have different precedence.
It's not often that anyone comes across what this means in practice.

In shoulda, these do different things:

    should redirect_to('#edit') { article_edit_path(@article) }
    should redirect_to('#edit') do
      article_edit_path(@article)
    end

To get a better grasp on the differences, consider these two simple methods:

    def outer(inner, &block)
      inner
      block.call('outer') if block_given?
    end

    def inner(&block)
      block.call('inner') if block_given?
      1
    end

Here `outer` is analogous to `should` and `inner` to `redirect_to`. Instead of
having any real logic, though, they call a block with what they are. In
practice:

    outer inner {|where| puts "#{where} called me"}

    # "inner called me"

    outer inner do |where|
      puts "#{where} called me"
    end

    # "outer called me"

![''](http://media.tumblr.com/tumblr_m0xla0BKm41qztl3j.jpg)
