Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails 4-如何使用枚举?_Ruby On Rails_Enums - Fatal编程技术网

Ruby on rails Rails 4-如何使用枚举?

Ruby on rails Rails 4-如何使用枚举?,ruby-on-rails,enums,Ruby On Rails,Enums,我正在尝试在Rails 4上制作一个应用程序 我发布了这个问题并得到了一些建议: 我正试图找出如何实施这一建议 目前,我有一个偏好模型: enum self_governance: { tier_1: 1, tier_2: 2, tier_3: 3, tier_4: 4,

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

我发布了这个问题并得到了一些建议:

我正试图找出如何实施这一建议

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

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
                        }           
在我的偏好表中,我有:

<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governance.to_a.map { |p| [p.humanize, p] } %>
我有一个首选项显示视图:

<%= @organisation.preference.self_governance.try(:humanize) %>
当我保存所有这些并尝试它时,会出现以下错误:

NoMethodError at /preferences/1/edit
undefined method `self_governance' for #<Class:0x007fde5b9fb500>
Did you mean?  self_governances
有人知道怎么做吗


我是否需要向首选项模型中的枚举添加def/end标记?我没有任何使用代码“enum”的经验。

Rails为您实现enum集合的多元化,例如,您的可能是自治

这意味着Preference.self_governances将返回包含定义的散列,而实际保存该值的属性是单数形式的,如@Preference.self_governances

例如:

@preference = Preference.new
@preference.self_governance = Preference.self_governances[:tier_1]
当您使用enum时,rails将在内部使用您定义的名称添加一个复数类方法定义,该定义将返回一个包含值的散列,并使用您定义的名称,正如您编写的那样,对于将获取/设置对象实例上枚举的实际值的属性访问器

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

因此,对于上面的示例,rails将添加一个Test.statuses方法,该方法只返回枚举的值。然后,对于测试对象的实例,您将拥有一个accessor@instance.status,其中包含您的姓名,您可以使用该姓名从Test.status返回的哈希中获取或设置状态


希望这是有意义的。

你已经很接近了:错误中的修复是正确的

您的选择正在呼叫

Preference.self_governance.to_a.map { |p| [p.humanize, p] }
你的错误告诉你多元化是错误的。请记住,如果对单个对象调用enum,它将是

@preference.self_governance
但是,如果你调用模型本身、首选项并请求集合,它是复数的

Preference.self_governances
因为枚举是特殊的,所以uour枚举只能是数组,而不是散列:

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] } %>

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

谢谢!这是可行的,但现在我得到了一个错误:未定义[tier_1,1]:数组的“人化”方法。当我从选择行中删除“humanise”时,我会得到一个同时显示关键点和值的表单。我只想显示值,但存储键。尝试使用“enum”是错误的吗?如果您没有使用哈希的理由,可以切换到数组,通常enum很简单,只是一个数组。因为您使用的是数字3这样的简单键,所以您可以在需要时使用数组索引。例如,这就是将存储在数据库中的内容。我将如何做到这一点?我只是尝试让视图显示文本,让数据库存储数字
<%= f.input :self_governance, as: :select, label: "Select your governance approach", collection: Preference.self_governances.map { |key, value| [key.humanize, key] } %>