ruby-on-rails - Rails - 用户在创建对象后按下 'Back',创建重复项

标签 ruby-on-rails ruby-on-rails-3 browser duplicates back-button

我遇到了一个问题,当用户填写我的评估表时,单击“创建”,然后单击浏览器的后退按钮,进行一些编辑,然后再次单击“创建”,它会创建重复的评估。

防止此类事情发生的最佳方法是什么。

只有一个 evaluation每个 survey_criterion 都应该存在关于创作。我不希望用户在点击后退按钮、使用新内容填写表单并再次单击“创建”后丢失他们输入的任何数据。

更新

路由文件

resources :survey_criteria do
  resources :groups do
    resources :evaluations
  end
end

调查标准.rb
has_many :evaluations

评价.rb
belongs_to :survey_criterion
belongs_to :group

有更复杂的关联,但我正在寻找的答案更多,“当用户按下'返回'按钮,修改表单,然后再次单击创建时,如何处理它”。

我希望它更新我认为在这种情况下自动创建的那个,而不是向用户抛出错误。我知道我可以添加一个会出错的验证,但我希望这对我认为的用户是不可见的。

想法?

最佳答案

最简单的解决方案是更改 create Action ,它应该像这个伪代码一样工作:

def create
  # ...
  if evaluation_exists?
    update_evaluation(params[:evaluation])
  else
    create_evaluation(params[:evaluation])
  end
  # ...
end

至于你的问题 “当用户按下'返回'按钮,修改表单,然后再次单击创建时,如何处理它” ,然后我使用一些 随机 token (短字符串)作为隐藏字段放置在表单中。

当创建请求到来时,我检查这个 token 是否已经存储在 session 中。如果不是,那么我创建该对象,并将该标记添加到已用标记列表中。如果 session 中已经存在 token ,我知道用户刚刚重新提交了表单,我可以采取相应的行动。通常我会问他是否应该创建另一个对象。在 session 中,我通常存储不超过 3-5 个 token 。

它看起来像这样(是的,这只是一个例子):
def create
  token = params[:token]
  session[:tokens] ||= []
  if session[:tokens].include? token
    render_the_form_again( "You have already created the object. Want another?" )
  else
    create_the_object
    session[:tokens] << token
  end
  # ...
end

关于ruby-on-rails - Rails - 用户在创建对象后按下 'Back',创建重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8392557/

相关文章:

ruby-on-rails - 如何使用 Form_For 更新模型中的哈希属性

php - 用PHP知道浏览器是否可以播放带有html5音频标签的音频文件

browser - 我应该使用 Electron 的 webview 来模拟浏览器吗?

javascript - 为什么JavaScript在常见的浏览器中没有得到自己的线程?

ruby-on-rails - CarrierWave - PDF - 只选择第一页

ruby-on-rails - 使用 Rails 3.2.11 和 RSpec 发布原始 JSON 数据

ruby-on-rails - 在 OSX 上安装 Mysql gem 错误 - 'Marshal data too short'

ruby-on-rails - Rails 引擎扩展 View ,而不是覆盖

ruby-on-rails - Rails 3 - 循环获取集合?

ruby - rails post 参数获取未找到的 id