Do End Your Braces

Mike Burns

Braces and do/end are completely swappable—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"

''

About thoughtbot

We've been helping engineering teams deliver exceptional products for over 20 years. Our designers, developers, and product managers work closely with teams to solve your toughest software challenges through collaborative design and development. Learn more about us.