如何在用户在rails中的浏览器中“返回”后防止重复表单提交

时间:2018-03-13 04:42:34

标签: javascript ruby-on-rails cache-control

我不想阻止用户使用“后退”按钮,但如果他们这样做,我想将它们重定向到根网址,以便我不会获得重复的条目。

到目前为止我所尝试的都没有奏效。我在before_action中试过这个:

response.headers["Cache-Control"] = "no-cache, no-store, must-revalidate"
response.headers["Pragma"] = "no-cache"
response.headers["Expires"] = "0"

我尝试在我的视图中添加一个隐藏的随机字符串:

<%= hidden_field_tag :token, "#{SecureRandom.hex}" %>

...使用此控制器操作:

def create
 token = params[:token]
 session[:tokens] ||= []
 if session[:tokens].include? token
   redirect_to root_path, notice: "That page is no longer viewable."
 else
  if @trade_wizard.trade.save
    session[:tokens] << token
    redirect_to root_path, notice: "Success."
  else
    redirect_to({ action: Wizard::Trade::STEPS.first }, alert: 'There was a problem.')
  end
 end
end

上面代码中的token会添加到session[:tokens],但是当我回击时不会发生重定向。为什么?此外,这是一个坏主意吗?我预见会话阵列会很快填满。

1 个答案:

答案 0 :(得分:2)

在rails代码中处理此代码可能不起作用,因为只有在用户回击时才能从浏览器缓存加载页面。 (可能都取决于可能超出标题的用户浏览器设置。)

而不是试图通过尝试阻止重新提交操作来阻止创建重复记录。您是否可以在模型中添加一些唯一性验证,以便在此之前检查记录是否已保存,如果存在则返回验证错误?

您甚至可以检查控制器中的验证错误对象,如果存在唯一性验证,则执行重定向而不是重新呈现表单的标准。