The two forms are equivalent.
The recommended style is to use the braces for one line blocks and use the "do"-"end" for multiline blocks.
Edit: Austin Ziegler pointed out (in the comment below) that the two forms have difference precedence levels: Curly braces have higher precedence. Therefore, when calling a method without parenthesis a block enclosed in {} will bind to the last argument instead of the calling method.
The following example was suggested by Austin:
def foo
yield
end
puts foo { "hello" }
puts foo do
"hello"
end
The first "puts" prints "hello": foo gets called returning "hello" which is the argument to puts.
The second bails with an error:
in `foo': no block given
Since in this case the do-end block binds to the puts method.
Thanks again to Austin for clearing this up.