我有一个页面可以创建记录 - 如果验证不满意,它会重定向到同一页面并显示错误消息。这是来自控制器的剪辑:
def create
@signature = Signature.new(signature_params)
if @signature.save
redirect_to "/thanks"
else
redirect_to :back, :notice => error_messages(@signature)
end
end
问题是,这导致整页刷新 - 因此错误消息不可见,因为输入表单位于页面的折叠下。当然,我可以将它放在页面的顶部,但是有没有办法在不重新加载页面的情况下显示消息?感谢。
答案 0 :(得分:1)
好的,所以这就是我已经解决的问题:
1)我正在客户端使用HTML5“必需”属性处理验证 - 它们是为此明确目的而创建的,不需要其他宝石或插件。它们在所有主流浏览器中都受支持。 Details in this article.
2)我已将错误消息移至页面顶部,以处理用户位于旧版或移动浏览器上或禁用JavaScript的情况。错误消息必须在完成请求 - 响应周期(即使这意味着重新加载页面)之后才能使用其他任何内容 - 这是一种不显眼的JavaScript方法。
3)对于AJAX版本,我将在表单元素as explained in the Rails guides上使用remote: => true
。一旦我完成了它的回调部分,我可能正在制作这个开源,并且会在这里发布一个链接。
答案 1 :(得分:-1)
显然,使用闪光灯处理错误是最均匀的。 DRY方式向用户显示正在发生的事情,但是如果你愿意在框外思考,你将能够通过自己处理错误来使用Ajax来完成类似的工作:
代码示例
#app/controllers/signatures_controller.rb
def create
@signature = Signature.new(signature_params)
if @signature.save
@success = "true"
end
respond_to do |format|
format.js { @errors = error_messages(@signature) }
format.html {
if @success.defined?
redirect_to "/thanks"
else
redirect_to :back, :notice => error_messages(@signature)
end
}
end
end
#app/views/signatures/create.js.erb
<% unless @success.defined? %>
alert(<%=j @errors.inspect() %>)
<% end %>
#app/assets/javascripts/signatures.js
$(document).on("submit", "#signature_form", function() {
$.ajax({
url: "/signatures"
type: "POST"
data: $(this).parent().serialize(); //serialize the form (not the button)
error: function() {
alert("Sorry, there was an error!");
}
});
});
你真的会更好地使用JSON。如果您喜欢这个想法,我可以重构它以包含JSON!