首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails 4-如何使用枚举?

Rails 4-如何使用枚举?
EN

Stack Overflow用户
提问于 2016-04-11 22:53:19
回答 2查看 2.7K关注 0票数 4

我正试图在Rails 4上制作一个应用程序。

我发了这个问题,并得到了一些建议:Rails 4 -Simple Form how to save key and display value

我正在设法找出如何执行这个建议。

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

代码语言:javascript
复制
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
                        }           

在我的首选表格中,我有:

代码语言:javascript
复制
<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governance.to_a.map { |p| [p.humanize, p] } %>

我有一个首选项显示视图:

代码语言:javascript
复制
<%= @organisation.preference.self_governance.try(:humanize) %>

当我保存所有这些并尝试它时,我会得到以下错误:

代码语言:javascript
复制
NoMethodError at /preferences/1/edit
undefined method `self_governance' for #<Class:0x007fde5b9fb500>
Did you mean?  self_governances

有人能看到如何使这件事成功吗?

是否需要将def/end标记添加到首选项模型中的enum中?我没有使用代码'enum‘的经验

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-11 23:10:01

)修补程序在错误中是正确的。

您的选择正在呼叫

代码语言:javascript
复制
Preference.self_governance.to_a.map { |p| [p.humanize, p] }

你的错误告诉你多元化是错误的。请记住,如果对单个对象调用enum,则

代码语言:javascript
复制
@preference.self_governance

但是,如果您调用模型本身,偏好,并请求一个集合,它是复数的。

代码语言:javascript
复制
Preference.self_governances

因为enum是特殊的,所以uour枚举可以是数组,而不是散列:

代码语言:javascript
复制
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 ]

你的看法应该是:

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

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

票数 1
EN

Stack Overflow用户

发布于 2016-04-11 23:08:56

Rails为您多元化枚举集合,例如,您的集合可以是self_governances

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

举个例子:

代码语言:javascript
复制
@preference = Preference.new
@preference.self_governance = Preference.self_governances[:tier_1]

当您使用enum时,rails将在内部添加一个具有您定义的名称的多元化类方法定义,该名称将返回带有值的散列,并将使用您定义的名称(正如您所写的那样)作为属性访问器,该属性访问器将获取/设置对象实例上枚举的实际值。

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

代码语言:javascript
复制
enum status: {
  active: 1,
  inactive: 2
}

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

希望这有意义。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36560700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档