如何使用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
相关产品推荐
相关产品推荐

