显示错误消息而不在Rails中重新加载页面

时间:2013-11-22 17:09:25

标签: ruby-on-rails validation user-experience

我有一个页面可以创建记录 - 如果验证不满意,它会重定向到同一页面并显示错误消息。这是来自控制器的剪辑:

def create
  @signature = Signature.new(signature_params)
    if @signature.save
      redirect_to "/thanks"
    else
      redirect_to :back, :notice => error_messages(@signature)
    end
end 

问题是,这导致整页刷新 - 因此错误消息不可见,因为输入表单位于页面的折叠下。当然,我可以将它放在页面的顶部,但是有没有办法在不重新加载页面的情况下显示消息?感谢。

2 个答案:

答案 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!