我声明了一个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'
但是输入选择器仍然是空白而不是显示“热情好客”。
任何想法都将不胜感激。 :)
答案 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' } %>
所以,我必须做两件事:
欢迎使用其他更简单的解决方案!