将错误列表从Sinatra传递到jQuery';什么是错误处理程序?

将错误列表从Sinatra传递到jQuery';什么是错误处理程序?,jquery,ruby,error-handling,sinatra,mongoid,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) i

我正在尝试将错误消息列表传递回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
在此示例中,如果用户提交错误的电子邮件和年龄数据,Sinatra将无法通过验证,并在
user.errors.full\u messages
中提供错误消息列表。这将是
电子邮件必须是有效的电子邮件地址
必须分别超过18岁

问题出在jQuery错误事件处理程序中。整个错误列表将变成一个字符串,而不是一个错误字符串列表:

{"errors":"[\"Email must be a valid email address\", \"Must be over 18 years of age\"]"}
我可以破解js部分并解析字符串,但这并不是一个合适的解决方案。我试着在Sinatra中搜索错误处理,并根据我的发现和这个,但我仍然不确定是否应该这样做错误处理。两者也只使用一条错误消息,而我需要提供多条错误消息

我的问题是:

  • 如何使用当前设置正确地将错误列表从Sinatra传递到jQuery的错误处理程序?或者

  • 如果我的错误处理逻辑不正确,那么使用从Sinatra到jquery的多条错误消息处理错误的正确逻辑是什么


问题来自
错误消息
方法,该方法将字符串数组转换为字符串。一个简单的解决方案是重写
initialize
,并在
MyError
类中有一个自定义的
messages
方法:

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

  attr_reader :messages
end

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

您应该更改的第一件事是http状态代码,您使用500(内部服务器错误)来根据用户输入验证错误。正确的错误代码为400(错误请求)。除此之外,您能否向我们展示您的Ajax调用以及触发的错误处理程序?
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