2012-03-02 60 views
2

我是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 %>工程。调用<%= gravatar_for user,size = 30%>会导致默认选项identicon丢失。我认为这是因为方法定义中的散列被来自调用方的散列覆盖。

我怎样才能让它可以通过某些选项,而其他的则默认为方法定义中指定的内容?我想打电话给<%= gravatar_for user, size: 30 %>,让它返回一个大小为30,格式为identicon的gravatar,尽管调用者省略了这个参数。

+0

合并两个哈希值:http://stackoverflow.com/questions/1980794/how-can-i-merge-two-hashes -without-覆盖重复的密钥功能于红宝石 – joeytwiddle 2015-01-16 23:09:01

回答

6

您可以设置默认选项哈希,然后merge用户已传递到该哈希的选项。这将只覆盖用户已指定的属性,并保留一切独自:

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

end 
相关问题