【问题标题】:Rails 4 - how to use enum?Rails 4 - 如何使用枚举?
【发布时间】:2016-08-02 07:46:18
【问题描述】:

我正在尝试在 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 标签?我没有任何使用代码“枚举”的经验

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案1】:

    你是如此接近 :) 修复就在错误中。

    您的选择正在调用

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

    你的错误告诉你复数是错误的。请记住,如果您在单个对象上调用 enum,它将是

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

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

    【讨论】:

    • 谢谢!那行得通,但是现在我收到此错误: ["tier_1", 1]:Array 的未定义方法 `humanize'。当我从选择行中删除“人性化”时,我会得到一个同时显示键和值的表单。我只想显示值但存储密钥。尝试使用“枚举”是错误的吗?
    • 如果你没有理由使用哈希,你可以切换到一个数组,通常枚举很简单,只是一个数组。由于您使用的是简单的键(如数字 3),因此您可以在需要时使用数组索引(例如,这将存储在数据库中)
    • 我该怎么做?,我只是想让视图显示文本和数据库来存储数字
    【解决方案2】:

    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 返回的哈希中获取或设置状态

    希望这是有道理的。

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2014-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多