Как я могу отобразить сообщения об ошибках проверки поля в форме формы с: remote => true? - PullRequest
2 голосов
/ 11 ноября 2011

У меня есть форма формы:

= semantic_form_for @record, :remote => true, :id => 'my_form', :url => ...

Поскольку я использую: remote => true, я обрабатываю ответ от контроллера в javascript:

$('#my_form')
  .bind("ajax:beforeSend", function(evt, xhr, settings){

  })
  .bind("ajax:success", function(evt, data, status, xhr){
      $('#response').append(xhr.responseText);
  })
  .bind('ajax:complete', function(evt, xhr, status){

  });

С помощью: remote => false моя форма автоматически отображает ошибки проверки полей, возникающие в результате попытки сохранить запись в контроллере, следующим образом:

@record = Record.new(params[:record])
@record.save

Как сделать так, чтобы ошибки проверки формы формировались с: remote=> правда, где я обрабатываю ответ сам в javascript?

Ответы [ 3 ]

4 голосов
/ 07 декабря 2011

Поместите форму formtastic в само представление.

В действии контроллера, которое обрабатывает опубликованную форму, вы можете повторно «визуализировать» представление, если запись не удалась.Когда представление будет отображено, formtastic просмотрит поле ошибок в @record и отобразит ошибки проверки.Если сохранение выполнено успешно, вы можете отобразить пустую строку, указывающую на успех.(Более сложная схема ответа возможна в зависимости от того, что вам нужно.)

  def save_record
    if request.xhr?               # form submitted using remote => true
      respond_with do |format|
        format.html do
          if @record.save
            # record saved successfully
            render :text => ""    # indicate success with empty response
          else                    # error saving record; send back form with validation errors marked
            render :template => '/path/to/record_form_view', :layout => false
          end
        end
      end
      return
    end
    #...
  end

Затем в клиентском JavaScript, когда запись не удается сохранить, вы можете заменить существующую форму отображаемым представлением.передан обратно из контроллера.

// reference: http://www.alfajango.com/blog/rails-3-remote-links-and-forms/
function setup_record_form_bindings() {
  $('#record_form_id')
  .bind("ajax:beforeSend", function(evt, xhr, settings){
    var $submitButton = $(this).find('input[name="commit"]');
    $submitButton.get(0).value = "Submitting...";
  })
  .bind("ajax:success", function(evt, data, status, xhr){      
      if (xhr.responseText === "") {              // successful save
                                                  // do somethign appropriate here
      } else {                                    // error saving
        $('#record_form_id').remove();            // remove old form, to replace with form in responseText
        $('#record_form_parent_id').append(xhr.responseText);  // should be the newly rendered form (with validation errors shown)
        setup_record_form_bindings();
      }
  })
  .bind('ajax:complete', function(evt, xhr, status){
  });
}
setup_record_form_bindings();
2 голосов
/ 29 ноября 2011

Поскольку вы используете javascript для публикации формы, я бы предложил выполнить проверку на стороне клиента перед отправкой каких-либо данных.Проверить https://github.com/bcardarella/client_side_validations

0 голосов
/ 21 апреля 2012

Ответ Эдвардса - лучший способ сделать это, так как он использует Formtastic для добавления ошибок. Если у вас (как и у меня) есть очень динамичная форма, которая добавляет поля при заполнении и извлекает изображения и данные на основе значений, которые вводит пользователь, это не вариант.

Я нашел этот Gist, который хорошо показывает, как добавлять ошибки так же, как Formtastic добавил бы их: https://gist.github.com/2083155/172ce92caa8d4ee738c32e72e27945e17c909428

Имейте в виду, что это дублирует логику, содержащуюся в Formtastic, которая никогда не является оптимальным решением. Если способ отображения ошибок в Formtastic изменится в какой-то момент в будущем, вам придется настроить этот код вручную.

...