Как выполнить сложную проверку формы на стороне сервера с помощью JQuery / Ajax (и Rails)? - PullRequest
4 голосов
/ 23 августа 2010

Я создаю приложение для вопросов и ответов на Rails с множеством сложных проверок (например, пользователь не может голосовать за свои собственные вопросы или голосовать по одному и тому же вопросу дважды и т. Д.). Я использую Ajax + JQuery для обновления информации на странице, если запрос выполняется, но хочу высветить полезные сообщения об ошибках, если есть проблемы. Хотя у меня нет проблем с проверками на стороне клиента, такими как проверка на наличие пустых полей, лучшее, что я могу сделать для чего-то вроде голосования по вашему собственному вопросу, это предотвратить выполнение любого javascript в контроллере Votes, чтобы счетчик голосов не обновляет Как это:

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 ]

1 голос
/ 25 ноября 2010

Сохраните свои проверки, сгенерируйте 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 %>

Это избавит вас от головной боли.

1 голос
/ 23 августа 2010

Проверка на стороне сервера

В вашей модели голосования:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...