You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用form_field实现文本框显示值与提交值不一致?

实现显示值与提交值分离的Rails表单字段

当然可行!这在Rails开发里是非常常见的需求,咱们可以通过**隐藏字段(hidden field)**轻松实现「显示一个值,提交另一个值」的效果。

问题分析

你当前的代码里,text_field虽然设置了readonly: true,但它仍然会把自身的value(也就是"Sarah")作为表单数据提交给服务器——因为它保留了对应字段的name属性。要实现显示和提交值分离,我们需要把「显示用的控件」和「提交用的控件」拆分开。

解决方案

修改你的代码,添加一个hidden_field来负责提交实际需要的值("Steve"),同时调整显示用的text_field,让它只做展示、不参与表单提交:

<td>
  <%# 这个隐藏字段负责向服务器提交实际要保存的code值 %>
  <%= f.hidden_field :code, value: "Steve" %>
  
  <%# 这个文本框仅用于显示,设置name: nil让它不被表单提交 %>
  <%= f.text_field :code, value: "Sarah", class: "account-rep-code", readonly: true, name: nil %>
</td>

原理说明

  • hidden_field会生成一个隐藏的表单输入框,它拥有正确的name属性(比如model[code]),所以表单提交时,它的value("Steve")会被发送到服务器并保存到对应的数据库字段。
  • 显示用的text_field设置了name: nil,这会让浏览器在提交表单时忽略这个控件,同时readonly: true保证用户不能修改显示的内容,完美保留你想要的输入框样式。

动态值适配

如果你的显示值和提交值是动态生成的(比如从数据库或变量获取),直接替换成对应的变量即可:

<td>
  <%= f.hidden_field :code, value: @user.actual_code %>
  <%= f.text_field :code, value: @user.display_name, class: "account-rep-code", readonly: true, name: nil %>
</td>

内容的提问来源于stack exchange,提问作者Bitwise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:03:23