如何使用JQuery/Ajax(和Rails)执行复杂的服务器端表单验证?
我正在Rails上构建一个问答应用程序,其中包含很多复杂的验证(例如,用户不能对自己的问题投票,或者对同一个问题投票两次,等等)。我一直在使用Ajax+JQuery在请求通过时更新页面上的内容,但如果出现问题,我希望闪烁有用的错误消息。虽然我对客户端验证(如检查字段是否为空)没有问题,但我能做的最好的事情(如对自己的问题进行投票)是防止在投票控制器中执行任何javascript,这样投票计数器就不会更新。像这样:如何使用JQuery/Ajax(和Rails)执行复杂的服务器端表单验证?,jquery,ruby-on-rails,ajax,Jquery,Ruby On Rails,Ajax,我正在Rails上构建一个问答应用程序,其中包含很多复杂的验证(例如,用户不能对自己的问题投票,或者对同一个问题投票两次,等等)。我一直在使用Ajax+JQuery在请求通过时更新页面上的内容,但如果出现问题,我希望闪烁有用的错误消息。虽然我对客户端验证(如检查字段是否为空)没有问题,但我能做的最好的事情(如对自己的问题进行投票)是防止在投票控制器中执行任何javascript,这样投票计数器就不会更新。像这样: if @vote.save respond_to do |format|
if @vote.save
respond_to do |format|
format.html {redirect_to :back}
format.js
end
else
respond_to do |format|
flash[:error] = "Sorry, there was an error."
format.html {redirect_to :back}
end
结束
StackOverflow给我一个错误消息,如果我试图投票支持我自己的问题,所以我知道这是可以做到的
感谢服务器端验证 在您的投票模式中:
validates_uniqueness_of :current_user
将传统控制器设置为编辑和保存
然后在jquery中使用以下命令:
$(".vote_link").submit(function(){
$.ajax({type: "POST",
url: $(this).attr("action"),
data: $(this).serialize(),
dataType: "script",
error: function(){ $("#message").show().html("You can't vote on this!")},
success: function(){ $("#message").show().html("You voted!")};
});
return false;
});
以及您的HTML/HAML:
= link_to 'Vote on This', new_vote_path(object)
保留您的验证,生成HTML,并将HTML作为响应发送回javascript,如下所示(使用jQuery): 投票/create.js.erb:
<% if @vote.errors %>
$('#vote_form').html("<%= escape_javascript(render(:partial => 'form').html_safe) -%>");
<% else %>
$('#vote_form').html("<%= escape_javascript(render(:partial => 'success').html_safe) -%>");
<% end %>
$(“#vote_form”).html(“'form').html_safe)%>”;
$(“#投票形式”).html(“'success').html_-safe)%>”;
这会让您省去一些麻烦。是的,上面的验证可以工作,但是如果验证没有通过(我的代码已经通过了),它只会回答false,而不会发送Ajax-y错误消息说明原因。底层代码对我来说没什么意义。这意味着在javascript文件中吗?js文件无法访问@question之类的变量,对吗?你是不是想一起远离Ruby?我必须考虑一下(使用纯ajax来解决这个问题)。但下面的示例是可以通过html/haml使用的。Haml是HTML的简写。它的语法有点不同。它就是没有这个功能。只需添加
,我对Ruby没有任何问题,我已经编写了验证,可以完成我想要的一切。问题是,我正在使用Ajax更新页面上的各种元素(例如,选票计数),如果请求没有通过,这些元素就不应该更新。如果请求未通过,则应显示错误消息。问题是我需要发送一个HTML请求来检查这些验证——这就是为什么我想通过Ajax.Hm找到一种方法来进行验证,所以您建议在我的控制器中执行验证,而不是在上面更新的模型中执行验证。对不起,我一定是迷上了控制器。模型也可以工作,尽管我个人会偏离这一点,因为它在DB上更重,否则你可以让它们在手之前加载所有这些。