如何使用JQuery / Ajax(和Rails)执行复杂的服务器端表单验证?

时间:2010-08-23 17:17:52

标签: jquery ruby-on-rails ajax

我正在Rails上构建一个Q& A应用程序,其中包含许多复杂的验证(例如,用户不能对他/她自己的问题进行投票,或者对同一个问题进行两次投票等)。如果请求通过,我一直在使用Ajax + JQuery来更新页面上的内容,但是如果有问题则希望闪存有用的错误消息。虽然我对客户端验证没有问题,比如检查一个字段是否为空,但我能做的最好的事情就是在你自己的问题上进行投票就可以防止在投票控制器中执行任何javascript,这样投票计数器就可以了没有更新。像这样:

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会给我一个错误消息,所以我知道它可以完成!

由于

2 个答案:

答案 0 :(得分:1)

服务器端验证

在您的投票模型中:

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)

答案 1 :(得分:1)

保持您的验证,生成HTML作为innerHTML到位,将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 %>

它会让你头疼。