【问题标题】:How to Properly Configure Rails 4.1 Enums in ActiveAdmin如何在 ActiveAdmin 中正确配置 Rails 4.1 枚举
【发布时间】:2014-06-18 08:31:36
【问题描述】:

我有一个 Rails 4.1 应用程序,我在其中使用枚举来表示对象的隐私级别。

在我的架构中:

t.integer "privacy_level", default: 0

在我的模型中:

enum privacy_level: { privacy_private: 0, privacy_trusted: 1, privacy_public: 2 }

在我的 ActiveAdmin 注册文件中:

index do
  column :privacy_level
  default_actions
end

form do |f|
  f.inputs "Edit My Model" do
    f.input :privacy_level
  end
  f.actions
end

在 ActiveAdmin 索引页面上,它运行良好。每个对象的隐私级别显示为“privacy_private”、“privacy_trusted”和“privacy_public”。

但是,当我尝试编辑对象时,输入类型是带有向上和向下箭头的数字框,无论该整数是否是有效的隐私级别(甚至是负值),我都可以将任何整数放入其中)。

我希望看到的是一个下拉(选择)输入,其中包含我在模型中定义的三个枚举字符串值。

【问题讨论】:

    标签: ruby-on-rails enums activeadmin


    【解决方案1】:

    以杰克的回答为基础,这对我有用。假设您的 ActiveRecord 模型是 Tweets:

    f.input :privacy_level, as: :select, collection: Tweet.privacy_levels.keys
    

    此处需要注意的关键事项:

    • 您的 ActiveRecord 有一个有用的字典(可在 enum_name.pluralize 中找到),其中包含值的枚举键。
    • 使用字符串(并忽略底层整数表示)可以更轻松地写入枚举值。

    【讨论】:

    • 这是正确的答案。起初我没有注意到复数(级别)。
    • :include_blank => false 会有所帮助
    • 记得在你的管理员定义中允许参数:)
    • 它对我不起作用,它抛出“'1' is not a valid (attribute name)”
    【解决方案2】:

    为了在 ActiveAdmin 的过滤器中使用枚举,请使用:

    filter :level, as: :select, collection: Model.levels
    

    假设有一个名为enum 的属性level

    这将确保在查询中实际放入整数值而不是键名。

    【讨论】:

      【解决方案3】:

      这样做:

      f.input :privacy_level, :as => :select, :collection =>  privacy_level.keys.to_a
      

      【讨论】:

      • 是的,这是有道理的。我可以使用 my_model.privacy_level = "privacy_public" 在控制台中设置隐私级别。我可以使用带有字符串的选择框来设置隐私级别是有道理的。谢谢!
      • 欢迎您,很高兴为您提供帮助,我支持您的问题,所以您可以明白这一点,请为我做同样的事情,谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-07-04
      • 2019-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      相关资源
      最近更新 更多