使用带有Simple_Form的Rails Active Record枚举类型

时间:2014-08-14 21:04:34

标签: ruby-on-rails enums simple-form

我声明了一个enum类型的模型,如:

class Event < ActiveRecord::Base
    enum event_type: { "special_event" => 0,
                       "pto"           => 1,
                       "hospitality"   => 2,
                       "classroom"     => 3
                       }

然后在我的更新视图中,我有一个表单:

<%= simple_form_for @event do |f| %>   
    <%= f.input :event_type, collection: Event.event_types.keys %>  
    ... 
<% end %>

这很好用,我得到一个用我的枚举类型填充的选择。 当我在控制器中执行@event.update(event_params)时,我可以检查数据库并看到event_type字段已更新为正确的整数值。

然而,当我再次访问编辑页面时,select会显示一个nil值。如果我通过在表单中​​添加调试行来检查其值:

<%= f.input :event_type, collection: Event.event_types.keys %>  
<%= debug @event %>

我看到event_type的值是正确的:

--- !ruby/object:Event
attributes:
  ...
  event_type: '2'

但是输入选择器仍然是空白而不是显示“热情好客”。

任何想法都将不胜感激。 :)

7 个答案:

答案 0 :(得分:16)

这条线很好用。 <%= f.input :event_type, collection: Event.event_types %>

您是否必须手动设置所选值? 你的simple_form版本是什么?

答案 1 :(得分:8)

使用enum_help gem。让你这样做:

<%= f.input :event_type %>

答案 2 :(得分:7)

Vincent的解决方案给了我错误:'0' is not a valid 'fieldname'

我必须按照其他stackoverflow帖子中的建议添加keys <%= f.input :event_type, collection: Event.event_types.keys %>

答案 3 :(得分:1)

我也被困在这个上面了。我需要对我的枚举进行定型,这样他们就不会因为我正在使用的蛇形而看起来如此不稳定。我曾经使用to_a来获取ruby哈希并将其转换为数组,然后我使用collect以我需要的格式返回一个新数组。

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

希望这会帮助其他人。

答案 4 :(得分:0)

感谢您的关注。我认为我报告的问题是由event_type的错误声明引起的。在我的迁移中,我不小心将event_type定义为 String 而不是 Integer

class CreateEvents < ActiveRecord::Migration
  def change
    create_table :events do |t|
      ...
      t.string :event_type
      ...
    end
  end
end

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

class Event < ActiveRecord::Base
  def self.types
    ['Special_Events', "On-Going", 'PTO', "Classroom"]
  end
  ...
end

然后,在我的表单中,使用了这种语法的简单形式:

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

一切运作良好。

答案 5 :(得分:0)

我使用http://www.tillys.com/product/Say-What/Short-Dresses/SAY-WHAT--Ribbed-Tank-Midi-Dress/Heather-Grey/285111595作为装饰器,所以我想在模型的装饰器中添加单词翻译。这是我的代码:

app / decorators / meter_decorator.rb

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

视图/米/ _form.html.erb

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

视图/米/ index.html.erb

{{1}}

答案 6 :(得分:-1)

通过更多的研究,我想出了以下解决方案:

<%= 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_types.keys [@event [:event_type] .to_i]来设置选择值。我很想知道我是否可以使用更简单的语法。 :)
  • 设置自动完成:'关闭'以防止Firefox在页面重新加载时将选择器设置为先前的设置。

欢迎使用其他更简单的解决方案!