我遇到问题,当用户填写我的评估表单时,单击“创建”,然后单击浏览器的后退按钮,进行一些编辑,再次单击“创建”,它将创建重复的评估.
什么是防止这种事情发生的最好方法.
在创建时,每个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