ruby-on-rails – 我们如何规避这些远程形式的缺点?
为了在我们的网站上翻译所有内容(包括验证的错误消息),我们几乎将所有表单切换为远程表单.虽然这有助于翻译错误消息,但我们遇到了其他问题,例如:
>如果用户多次单击提交按钮,则会多次调用该操作.如果我们有一个用于在数据库中创建新记录的远程表单,并假设用户的数据有效,则每次单击将添加一个新对象(具有完全相同的内容).有没有办法确保这些事情不会发生? 有什么地方我可以阅读有关远程表单最佳实践的内容吗?我怎么能处理多次点击问题?将所有表单切换到远程表单是一个非常大的错误吗? 解决方法
最简单的解决方案是为每个表单生成一个令牌.然后,您的创建操作可以确保它尚未使用,并确定是否应创建记录.
以下是我将如何编写此功能.请注意,我实际上没有测试过这个,但这个概念应该可行. 1. def new @product = Product.new @form_token = session["form_token"] = SecureRandom.hex(15) end 2. <%= hidden_field_tag :form_token,@form_token %> 3. def create # delete the form token if it matches if session[:form_token] == params[:form_token] session[:form_token] = nil else # if it doesn't match then check if a record was created recently product = Product.where('created_at > ?',3.minutes.ago).where(title: params[:product][:title]).last # if the product exists then show it # or just return because it is a remote form redirect_to product and return if product.present? end # normal create action here ... end 更新:我上面描述的有一个名字,它被称为同步器(或Déjàvu)令牌.如in this article所述,是防止双重提交的正确方法.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |