You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:35:50