ard*_*vis 6 browser ruby-on-rails back-button duplicates ruby-on-rails-3
我遇到问题,当用户填写我的评估表单时,单击"创建",然后单击浏览器的后退按钮,进行一些编辑,再次单击"创建",它将创建重复的评估.
什么是防止这种事情发生的最好方法.
evaluation每个survey_criterion创作时只应存在一个.我不希望用户在点击后退按钮后丢失他们输入的任何数据,用新内容填写表单,然后再次单击"创建".
UPDATE
的routes.rb
resources :survey_criteria do
resources :groups do
resources :evaluations
end
end
Run Code Online (Sandbox Code Playgroud)
survey_criterion.rb
has_many :evaluations
Run Code Online (Sandbox Code Playgroud)
evaluation.rb
belongs_to :survey_criterion
belongs_to :group
Run Code Online (Sandbox Code Playgroud)
有更复杂的关联,但我正在寻找的答案更多,"当用户按下'返回'按钮,修改表单,然后再次单击创建时,如何处理它.
我希望它更新我认为在这个实例中自动创建的那个,而不是向用户抛出错误.我知道我可以添加一个错误的验证,但我希望这对我认为的用户是不可见的.
思考?
最简单的解决方案是更改create动作,它应该像这个伪代码一样工作:
def create
# ...
if evaluation_exists?
update_evaluation(params[:evaluation])
else
create_evaluation(params[:evaluation])
end
# ...
end
Run Code Online (Sandbox Code Playgroud)
至于你的问题"当用户按下'返回'按钮时,如何处理它,修改表单,然后再单击再次创建",然后我使用一些随机标记 (一个短字符串)放置为表单中的隐藏字段.
当创建请求到来时,我检查此令牌是否已存储在会话中.如果不是,那么我创建对象,并将该标记添加到已使用的标记列表中.如果令牌已经存在于会话中,我知道用户刚刚重新提交了表单,我可以采取相应的行动.通常我会问他是否应该创建另一个对象.在会话中我通常不会存储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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2009 次 |
| 最近记录: |