Я думаю, вы неправильно поняли, как работает Ruby в этом случае.
Это правда, что вы помещаете все в блок, но это не имеет ничего общего с циклом.
Что вы на самом деле делаете в
(1..10).each do |i|
p i
end
создает блок {|i| p(i); }
и отправляет его в функцию Range.each()
То же самое с form_for
. На самом деле вы создаете блок {|f| puts( f.text_field(:name)); }
и передаете его в функцию form_for. (теперь он использует не путы, а конкатенацию строк, но вы поняли).
Так что это в основном не цикл, а лямбда-функция, которая будет вызываться несколько раз при вызове в цикле.
Вот еще немного информации о блоках
Обновление:
По поводу вашего обновления. В некотором смысле, да, это главное преимущество. Это не совсем верно, но вы поняли идею. Цель этого блока (и многих других) состоит в том, чтобы облегчить чтение и понимание кода. А также для ускорения разработки.
Деление кода на блоки всегда искали, достаточно взглянуть на концепцию функций, классов и других операторов.
Например,
, form_for
в основном для ускорения разработки. Да, он создает начальный и конечный теги, но это еще не все.
<% form_for @story do |f| %>
<%= f.text_field :name -%>
<% end %>
На самом деле может быть написано что-то вроде:
<form action="<%= polymorphic_edit_path(@story) -%>"
id="<%= @story.class_name.underscore -%>">
<%= text_field :story, :name -%>
</form>
конечно, это не совсем так, это намного упрощается, и функция form_for
может сделать намного больше, но, по крайней мере, вы должны получить картину.