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の文法で最も気にいっている仕様の一つだ。