[英]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#merge或Hash#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.