用户单击后退按钮时如何避免创建重复的实体?

时间:2019-07-10 13:52:52

标签: ruby-on-rails duplicates back-button

我遇到一个问题,即我有一个创建实体的表格,比如说一个调查。提交表单后,会将用户带到具有更多字段的同一实体的“编辑”表单。

某些用户按BACK(返回)按钮,最终两次重新提交同一调查。

什么是防止这种情况发生的好方法?

在生成“新”表单时,我是否必须生成某种UID,然后将其与调查一起保存。然后,如果用户回击,则该表单中将已经存在相同的UID,我可以检测到它。

是否有更直接的解决方案不需要我在调查中存储新信息?

1 个答案:

答案 0 :(得分:0)

您可以对实体属性使用范围内的验证,例如,如果调查中有多个问题,则它们会创建一些问题,但是返回并重新提交,因为问题已经存在,它们会收到验证错误。

class Question < ApplicationRecord
  belongs_to :survey
  validates_uniqueness_of :name, scope: [ :survey_id ]
end

当然,如果他们更改问题的名称,这将无济于事,例如,如果他们忘记在最后添加一个问号……验证将通过。对于这种情况,您可以使用自定义验证程序:

class Question < ApplicationRecord
  belongs_to :survey
  validate no_similar_question

  def no_similar_question
    errors.add(:name, "You have already created a similar question in this survey!") if survey.questions.where("name like ?", "%#{name}%").count > 1
    # 
  end
end

如果操作失败,您可以警告他们“问题已创建”,也可以重定向它们以编辑原始输入,也许他们只是意识到自己犯了一个错误,或者想在继续之前仔细检查。帮助改善用户体验。