我不想阻止用户使用“后退”按钮,但如果他们这样做,我想将它们重定向到根网址,以便我不会获得重复的条目。
到目前为止我所尝试的都没有奏效。我在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]
,但是当我回击时不会发生重定向。为什么?此外,这是一个坏主意吗?我预见会话阵列会很快填满。
答案 0 :(得分:2)
在rails代码中处理此代码可能不起作用,因为只有在用户回击时才能从浏览器缓存加载页面。 (可能都取决于可能超出标题的用户浏览器设置。)
而不是试图通过尝试阻止重新提交操作来阻止创建重复记录。您是否可以在模型中添加一些唯一性验证,以便在此之前检查记录是否已保存,如果存在则返回验证错误?
您甚至可以检查控制器中的验证错误对象,如果存在唯一性验证,则执行重定向而不是重新呈现表单的标准。