首页 > 解决方案 > Rails API - 将字符串参数转换为枚举值

问题描述

在 Ruby on Rails 应用程序中,假设有一个具有如下enum字段的模型:

class Car < ActiveRecord::Base
  enum color: {
    blue: 0,
    green: 1,
    red: 2
  }
end

有一个 API 端点用于创建我的模型的新实例。

发送的值与键params[:color]不匹配。enum(例如,“深海蓝”之类的东西作为参数值发送)。

我知道我可以将我的更改enum为:

class Car < ActiveRecord::Base
  enum color: {
    'Deep Ocean Blue' => 0,
    # ... etc.
  }
end

但这使得 Rails 生成的方法变得enum奇怪且难以使用......

my_car.blue?
my_car.send('Deep Ocean Blue?') # not even sure this works but you get the idea

我的问题是,处理这种情况的最佳(“Railsiest”)方法是什么?

我应该创建参数和枚举键的映射,并在 before_validation 挂钩中转换正确的枚举值,还是有更好的处理方法?

谢谢!

标签: ruby-on-railsrubyapiruby-on-rails-5

解决方案


underscore如果您有恒定的颜色选项,您可以尝试使用方法

2.6.5 :007 > "Deep Ocean Blue".parameterize.underscore
=> "deep_ocean_blue" 

您可以将枚举保留为

class Car < ActiveRecord::Base
  enum color: {
    'deep_ocean_blue' => 0,
    'golden_rose' => 1,
    # ... etc.
  }
end

在创建对象时将参数颜色转换为underscore

Car.create(color: params[:color].parameterize.underscore, # other parameters ..)

推荐阅读