将错误列表从Sinatra传递到jQuery';什么是错误处理程序?
我正在尝试将错误消息列表传递回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
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