Все это было бы более читабельно, как:
if something.do_stuff
#successful code
else
#unsuccessful code
end
или использовать обычную идиому рельсов:
if @user.save
render :action=>:show
else
@user.errors.each{|attr,msg| logger.info "#{attr} - #{msg}" }
render :action=>:edit
end
ИМХО, избегание возврата логического значения - это чрезмерное использование блоков кода.
Блок имеет смысл, если. , .
Позволяет коду использовать ресурс, не закрывая его
open("fname") do |f|
# do stuff with the file
end #don't have to worry about closing the file
вызывающему коду придется выполнять нетривиальные вычисления с результатом
В этом случае вы избегаете добавления возвращаемого значения в область вызова. Это также часто имеет смысл с несколькими возвращаемыми значениями.
something.do_stuff do |res1, res2|
if res1.foo? and res2.bar?
foo(res1)
elsif res2.bar?
bar(res2)
end
end #didn't add res1/res2 to the calling scope
Код должен вызываться как до, так и после выхода
Вы видите это в некоторых помощниках рельсов:
<% content_tag :div do %>
<%= content_tag :span "span content" %>
<% end -%>
И, конечно, итераторы - отличный пример использования, так как они (как считают рубиисты) красивее for
циклов или списочных представлений .
Конечно, это не исчерпывающий список, но я рекомендую вам не просто использовать блоки, потому что вы можете.