Ruby,Rails ハッシュの{}(ブレース)省略
RubyのHashの{}
省略
今回は、私がRubyやRailsを学習していて何度かつまづいた、ハッシュによる引数の渡し方について簡単にまとめておきます。
具体的に何でつまづいたかというと、Hashの{}
の省略です。
つまづいたポイント
例えば、Railsにはform_tag
メソッドがあります。
参考:form_tag - API dock
フォームに入力された情報をGETで送りたかったのですが、Syntax error
と表示されて上手く動きませんでした。
そのときは以下のようなコードを書いていました。
<% form_tag :controller => "pages", :action => "create", :method => :get %> <% end %>
何が問題なのかしばらく悩んだのですが、原因は、Rubyの引数にHashを渡すときのルールにありました。
Hashの{}
省略
Rubyでは、引数リストの最後がHashの場合は、{}
を省略することができます。
こちらについては、Rubyのメソッドの引数受け渡しまとめ Hashの{}
省略 -Qiitaに分かりやすくまとめてありました。
「引数リストの最後がHashの場合は、{}
を省略することができます。」と言われてピンと来ない方は、上の記事をご覧ください。
この記事で重要なポイントは、
省略できるのは一番最後のみである。下記のように途中にHashがある場合はエラーになる。
ということです。
解決策
もう一度最初のコードを見てみましょう。
<% form_tag :controller => "pages", :action => "create", :method => :get %> <% end %>
このコードは、Hashの{}
が省略されているので、{ :controller => "pages", :action => "create", :method => :get }
という1つのHashを引数として渡していると解釈されています。
さて、form_tag - API dockでform_tag
の使い方を確認してみると、次のように書いてあります。
form_tag(url_for_options = {}, options = {}, &block)
私のコードで言う:controller => "pages", :action => "create"
がurl_options
にあたり、:method => :get
がoptions
にあたります。
つまり、:controller => "pages", :action => "create"
と:method => :get
は、別々のHashで渡さなければならなかったのです。
ということで、以下のように、最初に出てくるHashを{}
で囲めば、2つのHashであると認識してくれて無事に動きました。
<% form_tag { :controller => "pages", :action => "create" }, :method => :get %> <% end %>