如何使用Simple Form将指定枚举值设为隐藏字段?
嘿,我来帮你搞定这个问题!针对你在PortStock模型里定义的action枚举,要在表单隐藏字段里设置正确的value,可以分两种场景来处理,结合Rails Enum的工作机制就能轻松解决:
先搞懂Rails Enum的取值逻辑
你定义的enum action: [ :buy, :sell ],Rails默认会把这两个选项映射成整数:buy对应0,sell对应1。同时,Rails也允许我们通过符号/字符串引用这些枚举值,会自动在符号/字符串和数据库存储的整数之间做转换。
场景1:新建PortStock记录,根据请求参数决定action
如果表单是用来新建记录,且action的值来自请求参数(比如URL参数、控制器传入的变量),可以通过PortStock.actions这个哈希获取对应枚举的数据库存储值:
比如控制器里拿到了要设置的action类型(从URL参数params[:action_type]获取'buy'或'sell'):
# 控制器代码示例 def new @port_stock = PortStock.new @target_action = params[:action_type] # 假设URL是 /port_stocks/new?action_type=buy end
然后在视图的隐藏字段里这样写:
<%= f.input_field :action, as: :hidden, value: PortStock.actions[@target_action] %>
PortStock.actions[@target_action]会返回对应的整数(比如0对应buy),这是最健壮的写法——哪怕以后调整枚举的顺序或值,这段代码都不用改动。
场景2:编辑现有PortStock记录
如果是编辑已有记录,直接用表单绑定的实例对象的action属性即可:
<%= f.input_field :action, as: :hidden, value: f.object.action %>
这里f.object就是当前的port_stock实例,f.object.action会返回枚举的符号(比如:buy),Rails在表单提交时会自动把它转换成对应的整数存储。
如果想直接用数据库里存储的整数值,也可以用action_before_type_cast:
<%= f.input_field :action, as: :hidden, value: f.object.action_before_type_cast %>
额外小技巧
其实Rails Enum也支持直接传入字符串作为参数,如果你确定要固定设置成buy,也可以直接写:
<%= f.input_field :action, as: :hidden, value: 'buy' %>
不过还是推荐用PortStock.actions[:buy]的方式,更灵活也符合Rails Enum的最佳实践。
内容的提问来源于stack exchange,提问作者marcamillion

