Как передать хэш параметров без перезаписи параметров по умолчанию? - PullRequest
2 голосов
/ 02 марта 2012

Я новичок в Ruby (Ruby 1.9.3 / RoR 3.2). Я написал эту функцию, чтобы создать граватар.

  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, хотя этот аргумент был опущен в вызывающей стороне.

1 Ответ

6 голосов
/ 02 марта 2012

Можно установить хэш параметров по умолчанию, а затем merge параметры, которые пользователь передал в этот хэш. Это только перезапишет свойства, которые указал пользователь, и оставит все остальное в покое:

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

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...