gpt4 book ai didi

ruby-on-rails - rails : Prevent duplicate inserts due to pressing back button and save again

转载 作者:行者123 更新时间:2023-12-04 04:53:47 27 4
gpt4 key购买 nike

考虑一个简单的 Rails 脚手架应用程序,它有一个"new"操作,其中包含一个表单,通过“保存”按钮将记录添加到数据库中。在“创建”操作之后, Controller 重定向到“显示”操作,用户可以在其中使用“编辑”链接来编辑刚刚插入的记录。到此为止,就这么简单。

但是,如果用户在创建记录后改为使用浏览器的后退按钮返回"new"操作,则浏览器将显示具有用户刚刚输入的值的表单。现在他更改了一些值并再次按下“保存”。他认为这会改变记录,但这当然会创造一个新的记录。

防止此类重复条目的首选方法是什么?我正在寻找一个通用的解决方案,可能基于 cookie 或 JavaScript。

最佳答案

经过一番调查,我找到了一个基于 cookie 的合适解决方案。这里是:

在 Controller 的"new"操作中,会生成带有当前时间的时间戳,并以隐藏字段的形式呈现在表单中。当用户提交表单时,这个时间戳会返回到 Controller 的“创建”操作。创建记录后,此时间戳存储在 session cookie 中。如果用户通过浏览器的后退按钮返回到"new"表单,他会得到一个陈旧的表单,这意味着它的时间戳比存储在 cookie 中的时间戳更旧。这是在创建记录之前检查的并导致错误消息。

这是 Controller 代码:

def new
@post = Post.new
@stale_form_check_timestamp = Time.now.to_i
end

def create
@post = Post.new(params[:post])

if session[:last_created_at].to_i > params[:timestamp].to_i
flash[:error] = 'This form is stale!'
render 'new'
else
@post.save!
@stale_form_check_timestamp = Time.now.to_i
session[:last_created_at] = @stale_form_check_timestamp
end
end

这里是表单代码:
- form_for @post do |f|
= tag :input, :type => 'hidden', :name => 'timestamp', :value => @stale_form_check_timestamp
= f.input :some_field
= .......

关于ruby-on-rails - rails : Prevent duplicate inserts due to pressing back button and save again,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4657758/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com