form_tagを使えばブロック内の全体を返してくれるかと思ったのですが、そうではないらしく最終行だけ返ってきてしまいます。

具体例

つまり

def generate_form(path)
  form_tag(path) do
    input_tag
    submit_tag
  end
end

だとフォームそのものと最終行のsubmit_tagだけが表示されてその他の入力フィールドが一切表示されません。

対策

なので以下のように毎行Stringを保存しておきましょう。何でこんな仕様になってるんだろう…?

def generate_form(path)
  form_tag(path) do
    str = input_tag
    str += submit_tag
    str
  end
end

参考

[ruby on rails – How do I use form_tag from within a helper? – Stack Overflow][1]