【问题标题】:How to avoid creating duplicate entities when users hit the back button? [duplicate]当用户点击后退按钮时如何避免创建重复的实体? [复制]
【发布时间】:2019-07-10 13:52:52
【问题描述】:

我有一个问题,我有一个创建实体的表单,比如说一个调查。提交表单后,用户将转到同一实体的编辑表单,其中包含更多字段。

有些用户按了“返回”按钮,最终重新提交了两次相同的调查。

有什么好的方法可以防止这种情况发生?

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以对实体属性使用范围验证,例如,如果调查将有_many Questions,他们会创建一些问题,但然后返回并重新提交,他们会收到验证错误,因为问题已经存在。

    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
    

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

    【讨论】:

    • 谢谢。我知道当您拥有应该是唯一的字段时,这很容易。对我来说不是这样。我使用了存储在实体上的令牌,这样我可以检查它是否已经创建。还有其他方法可以做到这一点,使用 cookie 和 JS,但我选择了这个。
    猜你喜欢
    • 2010-12-30
    • 2011-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-03
    相关资源
    最近更新 更多