Ruby控制器中将字符串转换为Enum的实现方法
问题解决办法
一、控制器内快速实现(不用单独建类)
方法1:给OpenStruct实例动态加判断方法
解析完数据后,直接给data对象添加对应的查询方法:
data = JSON.parse(request.body.read, object_class: OpenStruct) current_event = data.event.to_sym # 动态添加审批状态判断方法 data.define_singleton_method(:purchase_approved?) do current_event == :PURCHASE_APPROVED end # 动态添加取消状态判断方法 data.define_singleton_method(:purchase_canceled?) do current_event == :PURCHASE_CANCELED end
之后就能直接调用data.purchase_approved?或者data.purchase_canceled?来判断状态。
方法2:用模块混入批量添加方法
先写一个包含所有判断逻辑的模块,再把它混入到OpenStruct实例里:
module EventStatusChecker def purchase_approved? self.event == "PURCHASE_APPROVED" || self.event == :PURCHASE_APPROVED end def purchase_canceled? self.event == "PURCHASE_CANCELED" || self.event == :PURCHASE_CANCELED end end # 解析并混入模块 data = JSON.parse(request.body.read, object_class: OpenStruct) data.extend(EventStatusChecker) # 使用示例 if data.purchase_approved? # 执行采购审批通过后的逻辑 end
二、更规范的方案:创建专属类定义枚举
如果后续要扩展更多事件类型或逻辑,单独创建类会更清晰:
Rails项目可直接用Enum
class WebhookPayload < OpenStruct enum event: { purchase_canceled: "PURCHASE_CANCELED", purchase_approved: "PURCHASE_APPROVED" } end # 使用方式 data = WebhookPayload.new(JSON.parse(request.body.read)) if data.purchase_approved? # 处理逻辑 end
非Rails项目手动实现
class WebhookPayload EVENT_OPTIONS = %w[PURCHASE_APPROVED PURCHASE_CANCELED].freeze def initialize(attrs) attrs.each do |key, value| instance_variable_set("@#{key}", value) define_singleton_method(key) { instance_variable_get("@#{key}") } end end def purchase_approved? @event == "PURCHASE_APPROVED" end def purchase_canceled? @event == "PURCHASE_CANCELED" end end # 使用方式 data = WebhookPayload.new(JSON.parse(request.body.read))
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

