ruby on rails:无法理解代码

时间:2016-01-14 17:26:04

标签: ruby-on-rails ruby

我是ruby on rails的新手,尝试用PHP重写rails项目,有人可以解释一下下一行代码的作用吗?

  def payment_types_billing
    I18n.t("customer.payment_types_billing").inject({}){|memo,(k,v)|
      memo[k.to_s.to_i] = v; memo}.
        merge({
           PaymentType::ACCOUNTCREDIT => I18n.t("customer.payment_types_billing.#{PaymentType::ACCOUNTCREDIT}", 
           :amount => number_to_currency(get_account_credit))
        })
  end

我不理解其中的一部分。如果有人能用人类语言解释那部分,我将非常感激。 :)

1 个答案:

答案 0 :(得分:3)

这些方法协同工作。通过调用payment_types,将发生以下情况:

首先它抓取了本地化yaml的一部分(可能在config / locales / en.yml中)。 For more on internationalization/localization, see this!

I18n.t("customer.payment_types_billing")

然后它在生成的可枚举(在这种情况下是一个哈希)上运行一个注入块,目的是返回一个新形成的结果(see about .inject here

.inject({}){|memo,(k,v)| memo[k.to_s.to_i] = v; memo}

这个块的结果似乎是一个哈希,其键是检索到的哈希的键,转换为整数(不知道被访问的数据,我不知道这是如何运作的)。 / p>

<强>附录:

我怀疑上面这个块的目的是将整数键分配给一个新的哈希(否则这是不可能的)。使用反转查看后面的步骤,这意味着最终打印的哈希将具有整数值,而不是字符串。

然后它向哈希添加两个新的键值对:

.merge({PaymentType::ACCOUNTCREDIT => I18n.t("customer.payment_types_billing.#{PaymentType::ACCOUNTCREDIT}", :amount => number_to_currency(get_account_credit))})

第一对的密钥等于ACCOUNTCREDIT,另一个值从YAML中检索。第二个是键:amount,其值为&#34; get_account_credit&#34; (可能是一个带小数输出的方法)转换为当前区域的货币。

当我们到达payment_types方法的实际内容时,上面的结果(新形成的哈希)是具有删除条件的块。如果get_account_credit返回非正数,则删除ACCOUNTCREDIT键控对

.delete_if {|key, value|  (key == PaymentType::ACCOUNTCREDIT && get_account_credit <= 0) }

最后,哈希被反转(键成为值,值成为键):

.invert