Ruby on rails 将Rails活动记录枚举类型与简单表单一起使用

Ruby on rails 将Rails活动记录枚举类型与简单表单一起使用,ruby-on-rails,enums,simple-form,Ruby On Rails,Enums,Simple Form,我声明了一个带有enum类型的模型,如下所示: class Event < ActiveRecord::Base enum event_type: { "special_event" => 0, "pto" => 1, "hospitality" => 2, "classroom" => 3

我声明了一个带有
enum
类型的模型,如下所示:

class Event < ActiveRecord::Base
    enum event_type: { "special_event" => 0,
                       "pto"           => 1,
                       "hospitality"   => 2,
                       "classroom"     => 3
                       }
我发现
事件类型的值是正确的:

--- !ruby/object:Event
attributes:
  ...
  event_type: '2'
但是输入选择器仍然是空的,而不是它应该显示的“热情”


如有任何想法,将不胜感激。:)

通过进一步研究,我提出了以下解决方案:

<%= f.input :event_type, collection: Event.event_types.keys,
            :selected => Event.event_types.keys[@event[:event_type].to_i], 
            input_html: { autocomplete: 'off' }  %>
Event.Event\u types.keys[@Event[:Event\u type].to\u i],
输入html:{autocomplete:'off'}%>
因此,我必须做两件事:

  • 使用:选中此选项可设置选择器的值。这需要繁琐的语法Event.Event\u types.keys[@Event[:Event\u type].to\u i]来设置选择值。我很想知道我是否可以使用更简单的语法:
  • 设置autocomplete:“off”以防止firefox希望在重新加载页面时将选择器设置为其先前的设置

我们欢迎其他更简单的解决方案

这条线路运行得很好<代码>

您必须手动设置所选值吗?
您的简单表单版本是什么?

谢谢您的跟进。我认为我报告的问题是由事件类型的错误声明引起的。在迁移过程中,我意外地将事件类型定义为字符串而不是整数:

class CreateEvents
我认为enum应该声明为整数才能正常工作。不幸的是,我没有测试将类型更改为integer是否有效,因为我实际上使用了不同的方法。我没有使用枚举,而是在模型中定义了事件类型集合:

class Event < ActiveRecord::Base
  def self.types
    ['Special_Events', "On-Going", 'PTO', "Classroom"]
  end
  ...
end
class事件
然后在我的表单中,使用简单表单和以下语法:

<%= f.input :event_type, collection: Event.types, input_html: { autocomplete: 'off' }  %>

一切都很顺利

使用宝石。允许您执行以下操作:

<%= f.input :event_type %>

我使用的是decorator,所以我想在model的decorator中添加单词翻译。这是我的密码:

app/decorators/meter\u decorator.rb

class MeterDecorator < Draper::Decorator
  delegate_all

  STATUS_MAPPING = {
    uninitialized: '未安装',
    good: '良好',
    broken: '故障',
    disabled: '禁止'
  }

  def status
    STATUS_MAPPING[object.status.to_sym]
  end
end
class MeterDecorator
视图/meters/_form.html.erb

<%= f.input :status, collection: MeterDecorator::STATUS_MAPPING, label_method: :last, value_method: :first, include_blank: false %>

views/meters/index.html.erb

<td><%= meter.decorate.status %></td>

文森特的解决方案给了我一个错误:
'0'不是有效的'fieldname'

我必须按照其他stackoverflow帖子中的建议添加

我也被困在这个问题上了。我需要给我的枚举加上标题,这样它们就不会在我使用的蛇壳上看起来那么摇摇晃晃了。我曾经使用a将ruby哈希转换成数组,然后使用collect以我需要的格式返回一个新数组

collection: Event.event_type.to_a.collect{|c| [c[0].titleize, c[0]]}

希望这能帮助其他人

如果您同意使用默认的简单表单标签作为枚举名,那么这种方法就可以了。如果要提供显示名称,则需要使用简单的Formi18n功能,并确保将枚举键作为符号而不是字符串传递。类似于
Event.Event\u type.symbol\u keys.keys
。我认为这不是最理想的。谢谢你的提示,我做了这个“``=f。输入:类别,集合:人口统计。类别。键,标签方法::标题```
<%= f.input :status, collection: MeterDecorator::STATUS_MAPPING, label_method: :last, value_method: :first, include_blank: false %>
<td><%= meter.decorate.status %></td>
collection: Event.event_type.to_a.collect{|c| [c[0].titleize, c[0]]}