form_tagのオプションとブロック

Railsでモデルと関連の無いところでフォームのデータを取ろうと思い、以下のようにform_tagを記述したのだが

<%= form_tag :action => :query , { :name => "hogeForm", :id => "hogeForm"} %>

エラーが出てしまう。

compile error
/app/init.html.erb:2: syntax error, unexpected ';', expecting tASSOC
...eForm", :id => "hogeForm"} ; @output_buffer.concat "\n    ...
                            ^

form_tagメソッドのシグネチャを調べてみたのだが、

def form_tag(url_for_options = {}, options = {}, *parameters_for_url, &block)

と、先頭のパラメタもハッシュなので、この(第2パラメタ以降の指定がある)場合"{}"(ブレース)は省けないんだったな。
そこで、以下のように書き換えたが、

<%= form_tag {:action => :query} , { :name => "hogeForm", :id => "hogeForm"} %>

相変わらずエラー。

compile error
/app/init.html.erb:2: syntax error, unexpected tASSOC, expecting '}'
;  form_tag {:action => :query} , { :name => "hogeF...
                       ^
/app/init.html.erb:2: syntax error, unexpected ',', expecting kEND
...form_tag {:action => :query} , { :name => "hogeForm", :id ...
                              ^

うーん。なんだろうと小一時間悩んだが、ちゃんとFAQに掲載されていることだった。
p {}で何も表示されません - Ruby FAQ

なるほど、"{}"ブレースがハッシュではなくブロックの開始と判断されているのか。

ということで更に修正、hogeFormもシンボルで書けるようなので修正。

<%= form_tag ({:action => :query} , { :name => :hogeForm, :id => :hogeForm }) %>

やっと正しくHTMLに変換された。

<form action="/app/query" id="hogeForm" method="post" name="hogeForm">

Rubyはメソッドパラメタを括る括弧が省けるので、メソッドがまるでカスタムなタグのように書ける。※それが嬉しくて、調子にのってしまったようだ。

※言語内でDSLを実現することが出来るため、個人的にはRubyの文法で最も気にいっている仕様の一つだ。