ryotatake blog

Webエンジニア

Ruby,Rails ハッシュの{}(ブレース)省略

RubyのHashの{}省略

今回は、私がRubyRailsを学習していて何度かつまづいた、ハッシュによる引数の渡し方について簡単にまとめておきます。

具体的に何でつまづいたかというと、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がある場合はエラーになる。

Rubyのメソッドの引数受け渡しまとめ -Qiita

ということです。


解決策

もう一度最初のコードを見てみましょう。

<% form_tag :controller => "pages", :action => "create", :method => :get %>
<% end %>

このコードは、Hashの{}が省略されているので、{ :controller => "pages", :action => "create", :method => :get }という1つのHashを引数として渡していると解釈されています


さて、form_tag - API dockform_tagの使い方を確認してみると、次のように書いてあります。

form_tag(url_for_options = {}, options = {}, &block)


私のコードで言う:controller => "pages", :action => "create"url_optionsにあたり、:method => :getoptionsにあたります。
つまり、:controller => "pages", :action => "create":method => :getは、別々のHashで渡さなければならなかったのです。


ということで、以下のように、最初に出てくるHashを{}で囲めば、2つのHashであると認識してくれて無事に動きました。

<% form_tag { :controller => "pages", :action => "create" }, :method => :get %>
<% end %>