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"