【问题标题】:Ruby: access values through tapRuby:通过点击访问值
【发布时间】:2017-07-08 04:31:29
【问题描述】:

我有一个 Calculator 类,其内容如下:

class Calculator
  DEFAULTS = {
    price: 4.25, size: 10000
  }.freeze

  def initialize(lead)
    @lead = lead
  end

  def lead_attributes
    @lead.attributes.symbolize_keys.merge(DEFAULTS)
  end

  def hash # massively simplified
    lead_attributes.tap do |h|
      h[:total] = h[:price] * h[:size]
    end
  end
end

我的问题是hash 方法总是返回来自DEFAULTS 的值,尽管@lead 具有6.50:price8000:size。如果我不将 DEFAULTS 合并到 @lead.attributes 中,我会得到一个 nil 错误:

undefined method `*' for nil:NilClass

简而言之,为什么我在点击属性时无法访问它们?仅当匹配的 @lead 属性为 nil 时,我才想加载 DEFAULTS

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 hash


    【解决方案1】:

    您可能想要使用reverse_merge(或者只是在相反的方向合并),否则merge 将始终使用默认值覆盖现有的@lead.attributes

    lead_attributes改为:

    def lead_attributes
      @lead.attributes.symbolize_keys.reverse_merge(DEFAULTS)
    end
    

    或者:

    def lead_attributes
      DEFAULTS.merge(@lead.attributes.symbolize_keys)
    end
    

    【讨论】:

    • Hash#merge 上的文档参考在这里会有所帮助。此外,在普通 ruby​​ 中没有方法 Hash#symbolize_keys
    • 啊,非常感谢!为那件事扯断我的头发,哈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 2013-02-02
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多