Hash引数便利よね

Railsの引数としてのHashの使い方上手いよな

Ruby on Railsのメソッド引数って、Hashが多いですよね。しかも、HashのキーとしてSymbolが使えて凄く直感的に書ける。

  • Hashを使った引数
redirect_to :controller => "user", :action => "home"

なんでもかんでもHashにすれば良いってわけじゃないけど、パラメータの数が不変の場合とか(上の例の場合、コントローラ指定しない場合もある)、オプション系のパラメータには凄い便利。
引数の意味調べるために呼び出すメソッドの引数のを受ける変数の名前を見て判断しなくていいし。

Hash引数使ってみる

例えばオプション系で使ってみる。例として、リダイレクト処理をして、flashのメッセージを指定できるメソッドを書いてみる。

  • Hash使わない場合
def redirect_with_message(location,message = nil)
  flash[:notice] = message
  redirect_to location
end

redirect_to({:controller => "user",:action => "home"},"ようこそ")
  • Hash使った場合
def redirect_with_message(location,options = {})
  flash[:notice] = options[:message]
  redirect_to location
end

redirect_to({:controller => "user",:action => "home"},{:message => "ようこそ"})


どうだろう。呼び出し方を比べると、下の方が分かりやすいと思う。この例の場合はわざわざこんなことをしなくてもいいが、引数が多くなったり、フラグ系の引数が含まれている場合、Hashを使わないやり方だと読みにくい場合がある。
フラグ引数を持つ場合の例として、例えば、検索のメソッドを作る。引数によって、検索結果そのものを返す場合と、ヒットした件数のみを返す場合を考える。

  • Hash使わない場合
class User
  def self.search(conditions,only_count = false)
    if only_count
      count(:all,:conditions => conditions)
    else
      find(:all,:conditions => conditions)
    end
  end
end

User.search(:home_address => "神奈川県",true)
  • Hash使った場合
class User
  def self.search(conditions,options = {})
    if options[:only_count]
      count(:all,:conditions => conditions)
    else
      find(:all,:conditions => conditions)
    end
  end
end

User.search(:home_address => "神奈川県",:only_count => true)


フラグ系の引数の場合、Hashを使わない場合は、呼び出し側からではtrueが何を意味するのか分からない。Hashを使った場合は呼び出し側からでもtrueの意味がわかる。


メソッドを作成する際に、オプション系の引数にはHashを使うのが便利だと思います☆