Rails 4 – 如何使用枚举?

我正在尝试在Rails 4上制作应用程序。

我发布了这个问题并得到了一些建议: Rails 4 -Simple Form如何保存键和显示值

我想弄清楚如何实现这个建议。

目前,我有一个偏好模型:

enum self_governance: { tier_1: 1, tier_2: 2, tier_3: 3, tier_4: 4, tier_5: 5 } enum autonomy: { tier_11: 1, tier_21: 2, tier_31: 3, tier_41: 4, tier_51: 5 } 

在我的偏好forms中,我有:

  

我有一个偏好显示视图:

  

当我保存所有这些并尝试它时,我收到此错误:

 NoMethodError at /preferences/1/edit undefined method `self_governance' for # Did you mean? self_governances 

任何人都可以看到如何使这项工作?

我是否可能需要在首选模型中为枚举添加def / end标签? 我没有任何使用代码’enum’的经验

你是如此接近:)修复是正确的错误。

你的选择是打电话

 Preference.self_governance.to_a.map { |p| [p.humanize, p] } 

而你的错误告诉你复数是错误的。 请记住,如果你在一个对象上调用枚举,那就是

 @preference.self_governance 

但是如果你调用模型本身,Preference,并请求一个集合,它是复数。

 Preference.self_governances 

因为enum是特殊的,你的枚举可能只是数组,而不是哈希:

 enum self_governance: [ tier_1, tier_2, tier_3, tier_4, tier_55 ] enum autonomy: [ tier_11, tier_21, tier_31, tier_41, tier_51 ] 

您的视图将如下所示:

 <%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governances.map { |key, value| [key.humanize, key] } %> 

它会存储数组的索引号,就像魔术一样:)

Rails为你self_governances了enum集合,所以你的可能self_governances

这意味着Preference.self_governances将返回带有定义的哈希值,而实际保存该值的属性是单个的,如@preference.self_governance

一个例子:

 @preference = Preference.new @preference.self_governance = Preference.self_governances[:tier_1] 

当您使用enum内部轨道将在内部执行时,添加一个复数类方法定义,其中包含您定义的名称,该名称将返回带有值的哈希值,并将使用您为属性编写的名称(如您所写)访问器将获取/设置对象实例上枚举的实际值。

另一个常见用途是状态,给定一个Test类:

 enum status: { active: 1, inactive: 2 } 

因此,对于上面的示例rails,将添加一个只返回枚举值的Test.statuses方法。 然后,对于Test对象的实例,您将拥有一个带有您的名称的访问者@instance.status ,您可以使用该名称来获取或设置Test.statuses返回的哈希的状态。

希望它有意义。