ruby-on-rails - Rails:使用模型中的常量将实例方法定义为关注点
问题描述
我想使用模型中的常量动态地将实例方法声明到关注中。
class Item < ApplicationRecord
STATES = %w(active disabled).freeze
include StatesHelper
end
module StatesHelper
extend ActiveSupport::Concern
# instance methods
self.class::STATES.each do |state|
define_method "#{state}?" do
self.state == state
end
end
end
但我得到错误:
NameError: 未初始化的常量 StatesHelper::STATES
但是如果我在定义的方法中使用常量,它会起作用:
module StatesHelper
extend ActiveSupport::Concern
# instance methods
def some_method
puts self.class::STATES # => ["active", "disabled"]
end
end
在我的情况下,如何使用模型中的常量?
解决方案
您可以使用self.included
钩子在包含时获取对包含类的引用。
module StatesHelper
extend ActiveSupport::Concern
def self.included(base)
base::STATES.each do |state|
define_method "#{state}?" do
self.state == state
end
end
end
end
class Item
STATES = %w(active disabled).freeze
include StatesHelper
end
item = Item.new
item.respond_to?(:active?) # => true
item.respond_to?(:disabled?) # => true
推荐阅读
- python - ImportError:无法导入名称 root_dir
- c - 尽管有几个芯片组,操作系统如何获得 x86 PC 的内存映射?
- java - 如何获得数组中一行的总和?
- ssh - Mobaxterm:Ctrl 键似乎被锁定
- python - Python内部类赋值
- python - 在python中一次执行10个函数,然后使用线程重新启动作业
- r - 当我尝试包含位置时,R 中“对”的非数字参数
- javascript - 在应用数字格式时如何避免这种情况我将最后一位数字的一部分替换为 0?
- amazon-web-services - 如何将现有的 Elasticsearch 数据从字符串转换为数字
- javascript - 创建新的城市状态对象