Хороший пример того, как rails response_to работает с ошибками проверки модели и формой ajax - PullRequest
4 голосов
/ 23 февраля 2012

Что я хочу

Я использую новые рельсы response_to Controller Api с формой ajax. Если объект не проверяет rails, возвращает объект Json Error и вызывает событие «ajax: error». Я хочу показать каждую ошибку далее / под соответствующим полем формы (мы используем форматирование).

Вот мой пример ..

контроллер:

class Admin::PrivateMessagesController < AdminController
  respond_to :json

  def create
    private_message = PrivateMessage.new(params[:private_message])
    private_message.save
    respond_with private_message
  end
end

вид

<%= form_for @private_message, :remote => true, :html => {"data-type" => "json"}  do |f|
  f.input :body
 ... 
  end %>

JS / CoffeeScript

я просто добавляю все ошибки в строку и показываю их ..

$("#new_private_message").on 'ajax:error', (event, data, status) ->
  error = "Errors: "
  $.each $.parseJSON(data.responseText), (field, errorMessage) ->
    error += "#{field}-#{errorMessage} "
  $('#errors').html(error)

объект ошибки json

{"body":["Please enter a message."],"subject":["Please enter a message."]}

мои вопросы!

  • Должен ли я сам разобрать JSON?
  • как я могу добавить сообщение об ошибке в поле?
  • Разве это не должно быть частью стандартного jquery-ujs?

1 Ответ

2 голосов
/ 12 апреля 2012

do i have to parse the json myself?

Да, ответы на ошибки не анализируются API-интерфейсом jQuery Ajax автоматически.Вы должны сделать это сами.

how can i add the error message to the field?

Вот очень быстрый пример того, как обрабатывать ошибки: http://jsfiddle.net/hpM6W/

Хотя гораздо более исчерпывающее решениетребуется.Например, в приведенном мной примере дважды отправьте и посмотрите, что произойдет ...

Существует множество наборов инструментов и библиотек для расширенной проверки на стороне клиента и представления сообщений об ошибках.Я настоятельно рекомендую посмотреть jQuery Validation Plugin , чтобы начать работу с проверкой формы.Вы все еще должны всегда выполнять проверку на стороне сервера и возвращать любые ошибки.

В прошлом я делал гибридную модель, в которой я выполнял бы проверку на стороне клиентакак удобство для пользователя (лучший пользовательский опыт), а также использовать плагин проверки jQuery для визуализации результата проверки на стороне сервера с помощью метода showErrors .

Вот краткий пример: http://jsfiddle.net/GNq84/ о том, как использовать showErrors для отображения итоговых сообщений об ошибках от проверки на стороне сервера.Обратите внимание, что в этом примере многократная отправка работает намного лучше.

Однако есть одно предупреждение: showErrors ожидает такие ошибки: { "element": "message" }, а не то, что у вас сейчас есть: { "element": [ "message1", "message2" ] }, но я будуоставь это на ваше усмотрение:)

...