Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用JQuery/Ajax(和Rails)执行复杂的服务器端表单验证?_Jquery_Ruby On Rails_Ajax - Fatal编程技术网

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

如何使用JQuery/Ajax(和Rails)执行复杂的服务器端表单验证?,jquery,ruby-on-rails,ajax,Jquery,Ruby On Rails,Ajax,我正在Rails上构建一个问答应用程序,其中包含很多复杂的验证(例如,用户不能对自己的问题投票,或者对同一个问题投票两次,等等)。我一直在使用Ajax+JQuery在请求通过时更新页面上的内容,但如果出现问题,我希望闪烁有用的错误消息。虽然我对客户端验证(如检查字段是否为空)没有问题,但我能做的最好的事情(如对自己的问题进行投票)是防止在投票控制器中执行任何javascript,这样投票计数器就不会更新。像这样: if @vote.save respond_to do |format|

我正在Rails上构建一个问答应用程序,其中包含很多复杂的验证(例如,用户不能对自己的问题投票,或者对同一个问题投票两次,等等)。我一直在使用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给我一个错误消息,如果我试图投票支持我自己的问题,所以我知道这是可以做到的


感谢服务器端验证

在您的投票模式中:

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上更重,否则你可以让它们在手之前加载所有这些。