如何在ruby on rails中使用instance_eval覆盖哈希常量

问题描述 投票:-2回答:1

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

```

类MessageTemplate

 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"
}

}结束



I wand to add below values to the above constant from a plugin in ruby on rails
this is the way I tried and failed

模块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 ruby-on-rails-4 rubygems
1个回答
0
投票
修改重复项或克隆而不是常量

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

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"

当然,还有其他方法可以做到这一点,有些方法比其他方法更优雅。但是,该原理是合理的,并且绝对比尝试直接修改该常量好,这可能会对您的应用程序产生意想不到的后果。
© www.soinside.com 2019 - 2024. All rights reserved.