[英]Preventing form submission conflicts between multiple users (Rails 2.x)
假设我在Rails 2.x驱动的网站管理中有一个简单的表单。
<form action="/products/123">
Price:
<input type="text" name="product[price]" value="12.99"></input>
Description:
<textarea name="product[description]">
A long and descriptive block of text goes here.
</textarea>
<input type="submit"></input>
</form>
因此,数据库会更新以包含Sally在表单中的内容,从而删除Joe在打开该页面时设置的价格。
当然,我不是第一个偶然发现这样的问题的人,但我从来没有必要处理它。 首先,这类问题有名吗? 第二,有哪些解决方案可以减少吸收?
想到的一些解决方案,但有一些有严重的缺点。
如果updated_at
时间戳从打开表单时更改,请不要保存记录。 但是你要保存的内容会发生什么? 您必须将要更改的内容复制到表单之外,重新加载编辑表单,然后将其粘贴回来,希望在此期间没有其他人编辑任何内容。
表单加载大多数字段已禁用,要求管理员“解锁”他们想要编辑的字段,并且只有解锁的字段会在提交时发送到服务器。 这大大降低了大型表单冲突的可能性,但在内容编辑过程中添加了大量点击,即使在99%的情况下都会很好。
基于JS的解决方案,可以进行脏字段检查,禁用任何与表单加载时具有相同值的表单输入,因此只提交了已更改的字段,我猜这个选项到目前为止最好。 但它确实听起来有点复杂,并涉及将我的模型转储到页面上的JSON,以便与表单提交处理程序进行比较。
但是,我相信我不是第一个遇到这个问题的人。 那么有一个标准的解决方案吗?
你检查过这个: http : //api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html ?
UPDATE
好吧,它并没有真正解释如果lock_version
错误该怎么办,但至少它比updated_at
更好。 这一切都取决于谁赢了,为什么。 如果Sally没有触及价格,那么在保存时更新Joe的数据似乎是合理的。 只需将原始值添加为隐藏字段,并在保存时将其与Sally的输入进行比较,以防出现lock_version
错误。 如果他们都修改了相同的字段,那么,没有运气。 有人应该获胜,或者您可以返回编辑页面并突出显示更改以供接受。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.