reverse_merge为方法设置默认参数的技巧
先来看一下hash的merge方法。
h1 = { "a" => 100, "b" => 200 } h2 = { "b" => 254, "c" => 300 } h1.merge(h2) #=> {"a"=>100, "b"=>254, "c"=>300} h1 #=> {"a"=>100, "b"=>200}
reverse_merge的作用与merge正好相反,merge时后面的优先级高,reverse_merge时前面hash的优先级高。
注意:这个方法是rails的activesupport提供的,不是ruby自带的方法。
reverse_merge最常见的用处就是在rails中为方法的hash参数设置默认值。
下面来个示例。
给Partials中Locals参数设置默认值
# erb中 <%= display_product @product, :show_price => true %>
# helper中 def display_product(product, locals = {}) locals.reverse_merge! :show_price => false render :partial => product, :locals => locals end
上面的方法是推荐的方法,比较好,如果你觉得太麻烦,也可以用一些hack的方法,有点ugly。
在erb中直接
locals: { show_price: defined?(show_price) ? show_price : false }
相当不错哦!