我正试图在Rails 4上制作一个应用程序。
我发了这个问题,并得到了一些建议:Rails 4 -Simple Form how to save key and display value
我正在设法找出如何执行这个建议。
目前,我有一个偏好模型:
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中?我没有使用代码'enum‘的经验
发布于 2016-04-11 23:10:01
)修补程序在错误中是正确的。
您的选择正在呼叫
Preference.self_governance.to_a.map { |p| [p.humanize, p] }你的错误告诉你多元化是错误的。请记住,如果对单个对象调用enum,则
@preference.self_governance但是,如果您调用模型本身,偏好,并请求一个集合,它是复数的。
Preference.self_governances因为enum是特殊的,所以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] } %>它将存储数组的索引号,就像魔术:)
发布于 2016-04-11 23:08:56
Rails为您多元化枚举集合,例如,您的集合可以是self_governances。
这意味着Preference.self_governances将返回带有定义的散列,而实际保存该值的属性是单数的属性,如@preference.self_governance。
举个例子:
@preference = Preference.new
@preference.self_governance = Preference.self_governances[:tier_1]当您使用enum时,rails将在内部添加一个具有您定义的名称的多元化类方法定义,该名称将返回带有值的散列,并将使用您定义的名称(正如您所写的那样)作为属性访问器,该属性访问器将获取/设置对象实例上枚举的实际值。
另一个常见的用途是状态,给定一个Test类:
enum status: {
active: 1,
inactive: 2
}因此,对于上面的示例,rails将添加一个Test.statuses方法,该方法只返回枚举的值。然后,对于Test对象的实例,您将有一个访问器@instance.status,其名称为您的名称,您可以使用它从Test.statuses返回的哈希获取或设置状态。
希望这有意义。
https://stackoverflow.com/questions/36560700
复制相似问题