如何在不覆盖默认选项的情况下传递选项哈希?

时间:2012-03-02 15:01:28

标签: ruby hash

我是Ruby的新手(Ruby 1.9.3 / RoR 3.2)。我写了这个函数来创建一个gravatar。

  def gravatar_for(user, options = { size: 50, default: 'identicon' } )
    gravatar_id  = Digest::MD5::hexdigest(user.email.downcase)
    s = options[:size]
    d = options[:default]
    gravatar_url = "http://gravatar.com/avatar/#{gravatar_id}.png?s=#{s}&d=#{d}"
    image_tag(gravatar_url, alt: user.name, class: 'gravatar')
  end

致电<%= gravatar_for user %>有效。调用&lt;%= gravatar_for user,size = 30%&gt;导致默认选项identicon丢失。我假设这是因为方法定义中的哈希被我从调用者传入的哈希覆盖。

如何制作它以便我可以传入一些选项,而其他选项默认为方法定义中指定的内容?我想调用<%= gravatar_for user, size: 30 %>并让它返回一个大小为30且格式为identicon的gravatar,即使调用者省略了该参数。

1 个答案:

答案 0 :(得分:6)

您可以设置默认选项哈希,然后merge设置用户已传入该哈希的选项。这只会覆盖用户指定的属性,并保留其他所有内容:

def gravatar_for(user, options = {})
  default = { size: 50, default: 'identicon' }
  options = default.merge(options)

end