ruby-on-rails – Rails – 用户在创建对象后按“返回”,创建重复项

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

什么是防止这种事情发生的最好方法.

在创建时,每个survey_criterion只应存在一个评估.我不希望用户在点击后退按钮后丢失他们输入的任何数据,用新内容填写表单,然后再次单击“创建”.

UPDATE

的routes.rb

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

survey_criterion.rb

has_many :evaluations

evaluation.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

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

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

它看起来像这样(是的,这只是一个例子):

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...