Geo*_*ann 8 browser controller ruby-on-rails crud
想想一个简单的Rails脚手架应用程序,其中包含一个表单,用于通过"保存"按钮将记录添加到数据库中.在"创建"操作之后,控制器重定向到"显示"操作,用户可以使用"编辑"链接编辑刚刚插入的记录.到目前为止,这么简单.
但是,如果用户在创建记录后使用浏览器的后退按钮返回"新"操作,则浏览器会显示包含用户刚刚输入的值的表单.现在他改变了一些值并再次按下"保存".他认为这会改变记录,但当然这会创造一个新记录.
防止此类重复条目的首选方法是什么?我正在寻找一个通用的解决方案,可能基于cookie或JavaScript.
经过一些调查,我找到了一个基于cookie的合适解决方案.这里是:
在控制器的"新"操作中,生成具有当前时间的时间戳,并将其作为隐藏字段呈现在表单中.当用户提交表单时,此时间戳将返回到控制器的"创建"操作.创建记录后,此时间戳存储在会话cookie中.如果用户通过浏览器的后退按钮返回"新"表单,则会获得陈旧形式,这意味着其时间戳早于存储在cookie中的时间戳.在创建记录之前检查并导致错误消息.
这是控制器代码:
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
Run Code Online (Sandbox Code Playgroud)
这里的表单代码:
- form_for @post do |f|
= tag :input, :type => 'hidden', :name => 'timestamp', :value => @stale_form_check_timestamp
= f.input :some_field
= .......
Run Code Online (Sandbox Code Playgroud)
当我遇到同样的问题时,我创造了解决这个问题的小宝石。当用户回击时,他将被重定向到edit_path记录的,而不是返回到new_path。
https://github.com/yossi-shasho/redirect_on_back
您可以执行以下操作:
def create
@user = User.new(params[:user])
if result = @user.save
redirect_on_back_to edit_user_path(@user) # If user hits 'back' he'll be redirected to edit_user_path
redirect_to @user
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5244 次 |
| 最近记录: |