提交表单时,不会保存对 Rails 输入标记的 javascript 更改

Posted

技术标签:

【中文标题】提交表单时,不会保存对 Rails 输入标记的 javascript 更改【英文标题】:javascript changes to rails input tag are not saved when the form is submitted 【发布时间】:2020-11-15 20:50:03 【问题描述】:

我正在将 rails 5 应用程序更新为 rails 6。在更新过程中,我意识到我的 rails 5 应用程序中有一个表单错误,该错误在 rails 6 版本上继续存在。 问题如下,视图有一个带有多个输入文本标签的表单(一个用于我的模型特征中定义的每个属性)。一个输入标签是一个下拉菜单,用于控制启用哪些输入标签,哪些不启用。这是由 on change 监听器管理的。此侦听器包含清除禁用字段的代码。逻辑如下:

用户选择选项A,则输入文本标签“attr_two”必须被清除和禁用 用户选择选项 B,则输入文本标签“attr_one”必须被清除和禁用。

使用 jquery val("") 函数或普通加入 .value = "" 将 value 属性设置为 "" 清理该字段(我已经过两种方式的测试)。问题是,在视图中一切正常,字段被清除和禁用,但是当我检查为数据库中的模型保存的数据是旧的而不是“”。因此,当用户想要编辑功能时,字段混合如下:

字段 1:Z 和字段 2:Y

但期望的行为是:

字段 1:Z 和字段 2:“” 字段1:“”和字段2:是

我不明白为什么输入文本标签上的 javascript 修改没有传递给 rails 控制器,而旧值是相同的,而不是 ""。

【问题讨论】:

html 和 js 代码的相关部分添加到问题中。我怀疑您正在使用一些 UI 工具来创建一个看起来像输入但不是实际输入的“魔术”字段,并在后台更新实际隐藏的输入。如果你用 js 更新它的值,它可能不会触发它运行所需的回调。 我刚刚注意到您说您禁用了这些字段。这真的是你的意思吗?如果这样做,则禁用字段不会发送到服务器(无论它们的值如何),并且 rails 不会更新它们的值。检查服务器日志以查看服务器实际接收到的内容(是“Field1=Z&Field2=Y”还是只是“Field2=Y” @SiimLiiser 击中了最后一条评论中的关键点。我禁用了这些字段,它导致了所描述的问题。我更改为只读属性,并且在我的 rails 表单中具有所需的行为。 我也将其发布为答案,因此对于遇到此问题的人来说更容易看到。如果有帮助请采纳。 【参考方案1】:

如果您禁用 html 中的字段,那么在提交表单时,无论其值如何,它们都不会发送到服务器。一旦 rails 收到请求,缺少的参数就会被解释为“没有变化”。

您应该将字段更改为只读而不是禁用,这样它们在用户看来仍然是禁用的,但会发送到服务器以更新为空。

更安全的选择是让逻辑在后端强制执行此操作。如果收到其中一个字段,请将另一个字段更新为空或根据您选择的值检查哪个字段应该为空。

但是,前端解决方案对于原型来说应该足够了。

【讨论】:

以上是关于提交表单时,不会保存对 Rails 输入标记的 javascript 更改的主要内容,如果未能解决你的问题,请参考以下文章

使用普通链接提交表单

博客应用程序在提交表单时未将属性保存到数据库

在提交失败时保持 jQuery - Rails

使用 ujs 手动提交远程表单的 Rails 方式

Ruby on Rails 复选框未在提交表单时更新

rails 在保存前使用表单输入值