我试图将错误消息列表传递回我的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 address
和Must 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的发现,但是我仍然不确定这是否应该进行错误处理。两者也都只使用一条错误消息,而我需要提供多条错误消息。
我的问题是:
最佳答案
问题来自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/