繁体   English   中英

如何在 Rails 中使用 instance_eval 覆盖 hash 常量

[英]How to override a hash constant using instance_eval in Rails

如何使用插件中的instance_eval覆盖 class 中的常量? 这是我要覆盖的常量:

class MessageTemplate < ActiveRecord::Base

     TEMPLATE_KEYS = {

    :guardian=>{
      :guardian_full_name=>"guardian_full_name",
      :guardian_first_name=>"guardian_first_name",
      :guardian_last_name=>"guardian_last_name",
      :ward_full_name=>"ward_full_name",
      :guardians_relation=>"guardians_relation",
      :ward_batch_name=>"ward_batch_name",
      :ward_admission_number=>"ward_admission_number",
      :guardian_email=>"guardian_email",
      :guardian_mobile_phone_no=>"guardian_mobile_phone_no"
    }

  }
end

我想将这些值从 Ruby on Rails 中的插件添加到上述常量。 这是我尝试过的,但失败了:


module IndepthEinvoice

         module MessageTemplate
    def self.included(base)
      base.instance_eval do
        self.TEMPLATE_KEYS = {
          :guardian=>{
              :payment_link=>"payment_link",
              :ward_balance_fee=>"ward_balance_fee"
          }
      }
      end
    end

修改重复或克隆而不是常量

Ruby 实际上不会阻止您重新分配常量; 它通常只会发出警告。 尽管如此,故意修改常量通常被认为是不好的形式。 相反,您应该使用Hash#mergeHash#merge! 将您的更改存储在本地 Hash object 中。 例如:

TEMPLATE_KEYS = {
  guardian: {
    guardian_full_name:       "guardian_full_name",
    guardian_first_name:      "guardian_first_name",
    guardian_last_name:       "guardian_last_name",
    ward_full_name:           "ward_full_name",
    guardians_relation:       "guardians_relation",
    ward_batch_name:          "ward_batch_name",
    ward_admission_number:    "ward_admission_number",
    guardian_email:           "guardian_email",
    guardian_mobile_phone_no: "guardian_mobile_phone_no",
  }
}

# make a copy of your TEMPLATE_KEYS constant
@my_template = TEMPLATE_KEYS.dup

# merge your modifications into an instance variable
@my_template[:guardian].merge!(
  {
    payment_link:     "payment_link",
    ward_balance_fee: "ward_balance_fee",
  }
)

@my_template.dig :guardian, :payment_link
#=> "payment_link"

当然还有其他方法可以做到这一点,有些方法比其他方法更优雅。 不过,这个原则是合理的,并且绝对比尝试直接修改常量更好,这可能会对您的应用程序产生意想不到的后果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM