【问题标题】:How do you pass in an options hash without overwriting default options?如何在不覆盖默认选项的情况下传入选项哈希?
【发布时间】:2012-03-02 15:01:28
【问题描述】:

我是 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 %> 有效。调用 会导致默认选项 identicon 丢失。我认为这是因为方法定义中的哈希被我从调用者传入的哈希覆盖。

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

【问题讨论】:

标签: ruby hash


【解决方案1】:

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

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

end

【讨论】:

    猜你喜欢
    • 2016-04-15
    • 1970-01-01
    • 2014-03-28
    • 2014-01-27
    • 2012-08-09
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多