Rails中基于Enum生成下拉选择框失败的技术求助
Rails Enum 下拉选择框报错问题解决
我来帮你梳理下问题所在,以及对应的解决办法:
第一个报错的原因
你写的 @order.fulfillment_status.map 之所以报错,是因为 @order.fulfillment_status 是订单实例的当前状态值(这里是字符串 "processing"),它是单个值,不是哈希或者数组,自然没有 map 方法。
第二个报错的原因
fulfillment_statuses 是 Rails Enum 生成的类方法,必须通过 Order 类来调用(比如你在控制台里用的 Order.fulfillment_statuses),而 @order 是 Order 的实例对象,实例并没有这个方法,所以会提示 undefined method 'fulfillment_statuses'。
正确的写法
写法一:直接在视图中调用类方法获取枚举选项
直接用 Order.fulfillment_statuses 拿到完整的枚举键值对哈希,再格式化显示文本:
<%= f.select :fulfillment_status, options_for_select(Order.fulfillment_statuses.map { |k, v| [k.humanize.capitalize, v] }) %>
如果需要默认选中当前订单的状态,只需要给 options_for_select 加第二个参数:
<%= f.select :fulfillment_status, options_for_select(Order.fulfillment_statuses.map { |k, v| [k.humanize.capitalize, v] }, @order.fulfillment_status) %>
写法二:在模型中封装选项逻辑(更优雅)
为了让视图代码更简洁,可以在 Order 模型里定义一个类方法来返回格式化好的选项:
class Order < ApplicationRecord enum fulfillment_status: { processing: 1, partially_fulfilled: 2, fulfilled: 3 } # 封装枚举选项的格式化逻辑 def self.fulfillment_status_options fulfillment_statuses.map { |key, value| [key.humanize.capitalize, value] } end end
然后视图里直接调用这个方法:
<%= f.select :fulfillment_status, options_for_select(Order.fulfillment_status_options, @order.fulfillment_status) %>
这样就能完美生成下拉选择框,同时默认选中当前订单的状态啦。
内容的提问来源于stack exchange,提问作者 uno
相关产品推荐
相关产品推荐

