繁体   English   中英

防止多个用户之间的表单提交冲突(Rails 2.x)

[英]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>
  1. Admin Sally想要更改说明。
  2. Admin Sally打开包含此表单的页面,并开始在textarea中编写一些新的销售副本。
  3. 几秒钟后,管理员Joe决定该产品需要继续销售
  4. Admin Joe打开包含表单的页面
  5. Admin Joe将价格降至9.99美元
  6. Admin Joe提交表单,将数据库中的价格设置为9.99美元
  7. Admin Sally完成了写副本并提交表单,但她浏览器中的价格字段仍然是12.99美元。
  8. 变得生气,并因为改变价格而对莎莉大吼大叫,尽管她不知道她刚刚那样做了。

因此,数据库会更新以包含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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM