jquery - 将错误列表从Sinatra传递到jQuery的错误处理程序?

标签 jquery ruby error-handling sinatra mongoid

我试图将错误消息列表传递回我的jQuery错误处理程序。我在网上阅读的大多数示例都只有一条错误消息,但是我正尝试传递多行。

这是一个例子:

post "/save/user" do
    user = params["user"]
    email = params["email"]
    age = params["age"]
    user = User.find(user)

    user.update_attributes(email: email, age: age)
    if user.valid?
        user.save!
    else
        run_errors(user.errors.full_messages)
    end

    json :done => "You have updated your profile!"
end

错误处理:
class MyError < StandardError; end

error MyError do
    content_type :json
    status 500
    {:errors => env['sinatra.error'].message}.to_json
end

def run_errors(errors)
    if not errors.empty?
        raise MyError, errors
    end
end

jQuery的:
$(".test").click(function(evn) {
     evn.preventDefault();
     var form = $("form");
     $.post("/save/user", form.serialize(), function(done) {
         console.log(done["done"]);         
     })
     .fail(errors) {
         console.log(errors["errors"]);
     });
});

在此示例中,如果用户提交了错误的电子邮件和年龄数据,Sinatra将使验证失败,并在user.errors.full_messages中提供错误消息列表。它们分别是Email must be a valid email addressMust be over 18 years of age

问题出在jQuery错误事件处理程序中。整个错误列表变成一个字符串,而不是错误字符串列表:
{"errors":"[\"Email must be a valid email address\", \"Must be over 18 years of age\"]"}

我可以破解js部分并解析字符串,但这听起来不像是一个合适的解决方案。我尝试在Sinatra中搜索错误处理,并基于this article和此SO Question的发现,但是我仍然不确定这是否应该进行错误处理。两者也都只使用一条错误消息,而我需要提供多条错误消息。

我的问题是:
  • 如何使用当前设置将我的错误列表从Sinatra正确传递给jQuery的错误处理程序?或者...
  • 如果我的错误处理逻辑不正确,那么处理带有从Sinatra到jquery的多个错误消息的错误的正确逻辑是什么?
  • 最佳答案

    问题来自Error#message方法,该方法将您的字符串数组转换为字符串。一个简单的解决方案是覆盖initialize并在messages类中具有自定义MyError方法:

    class MyError < StandardError
      def initialize(messages)
        @messages = messages
        super(messages)
      end
    
      attr_reader :messages
    end
    

    然后,您可以稍微更改代码以调用消息而不是消息(如果可用)(可以编写更紧凑的代码,但我希望示例易于阅读):
    error MyError do
      content_type :json
      status 500
      m = if env['sinatra.error'].respond_to? messages
        env['sinatra.error'].messages
      else
        [ env['sinatra.error'].message ]
      end
      {:errors => m}.to_json
    end
    

    请注意,当只有一条消息时,我将其嵌入到数组中,以便Javascript代码始终可以期望其中包含一个或多个字符串的数组。您可能想要以不同的方式进行操作。

    关于jquery - 将错误列表从Sinatra传递到jQuery的错误处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25927012/

    相关文章:

    java - 线程 “main”中的异常java.lang.IllegalStateException : The driver executable is a directory

    .net - 如何检查LINQ to SQL连接错误

    asp.net-mvc - 扩展HandleError属性-状态码112031(连接重置)

    javascript - 汉堡菜单,如何改变十字的颜色

    javascript - 使用 confirm() 表单打开新标签页或窗口

    javascript - 如何在没有 Gem 的情况下将 JQuery 插件安装到 Rails 5.0

    ruby-on-rails - 将 gem 中的 I18n 翻译动态加载到 Rails 引擎中

    javascript - 如何使用流畅的动画 adobe edge 滚动到 anchor

    ruby-on-rails - 基于 request.ssl 通过 HTTPS 动态提供文件?附附件

    ruby-on-rails - 如何按升序对 ruby​​ 数组进行排序但最后保持零