Хорошо, так что идея здесь вместо чего-то вроде этого
form_for @obj do |f|
f.text_field :field
end
вы получите что-то вроде этого
form_for @obj do
text_field :field
end
первый путь довольно прост, в итоге получается шаблон, который выглядит следующим образом
def form_for
b = FormBuilder.new
yield b
b.fields.each |f|
# do stuff
end
end
вы выдаете объект построителя, для которого потребитель вызывает методы, а затем вы вызываете методы объекта построителя для фактического построения формы (или чего-либо еще)
второй немного более магический
def form_for &block
b = FormBuilder.new
b.instance_eval &block
b.fields.each |f|
#do stuff
end
end
в этом, вместо того, чтобы уступать строителю в блок, мы берем блок и оцениваем его в контексте строителя
Второй увеличивает сложность, потому что вы играете в игры с объемом, вы должны это понимать, и потребитель должен это понимать, и тот, кто писал вашему строителю, должен это понимать. Если все на одной странице, я не знаю, что это плохо, но я ставлю под сомнение преимущества по сравнению с затратами, я имею в виду, насколько сложно просто нажать на f. перед вашими методами?