2013-06-23 4 views
0

У меня есть Picture модели с различными валидациями:оповещение обусловливающего проверок модели

список
validates :title, presence: true 
    validates :caption, presence: true 
    validates :image, presence: true 
    validates :price, numericality: { greater_than_or_equal_to: 1, less_than_or_equal_to: 1000 } 
    validates_size_of :tag_list, :minimum => 3, :message => "please add at least three tags" 

Тега должен быть представлен в определенном формате: по крайней мере три тег, разделенную запятой и пробел: например, foo, bar, cats

Я хочу иметь предупреждение, которое говорит пользователю «пожалуйста, подождите, мы загрузив изображение» - но только ПОСЛЕ того, как модель прошла ВСЕ валидации (до .save в контроллере)

Есть ли способ сделать это в контроллер, который я предпочел бы, или я должен использовать некоторые JavaScript, как:

$("form#new_picture").on("submit", function() { 
    if LOTS OF HORRIBLE REGEX ON FORM FIELDS { 
     MESSAGE HERE 
     return true; 
    } else { 
     return false; 
    } 
    }); 

ИЛИ Есть ли способ сделать это в модели, в рамках after_validation Перезвони?

Любые предложения, которые были высоко оценены. Заранее спасибо.

ответ

0

Я бы построил JS-функцию, чтобы извлечь поля, которые я хочу проверить.

Затем создать пользовательский AJAX действие контроллера, который:

  • создает новый объект с заданным Params
  • вызова действителен? на нем, не сохраняя его

Тогда:

  • В случае неудачи, обновить форму с сообщениями об ошибках
  • В случае успеха, я бы возвращать ответ пользовательского АЯКСА, чтобы отобразить предупреждение и начать проводку реального объект.
0

Я понял, что это не представляется возможным через через модель или контроллер, и прибег к сочетанию трех процессов проверки:

  • Validations в модели
  • simpleform client side validations gem - это хорошо, он проверяет достоверность в тот момент, когда поле формы теряет фокус - «проверка в реальном времени».
  • И некоторые additional javascript для предупреждения со всплывающими окнами и ошибками, вставленными ниже.

Надеемся, что это делает форму практически не подлежащей подаче, не зная, чего не хватает.

JS РЕШЕНИЕ

ФОРМА

<form id="new_pic" novalidate> 
    <p><input type="file" name="file" required></p> 
    <p><input type="string" name="name" placeholder="Name" required></p> 
    <p><input type="string" name="tags" placeholder="Tags" data-validation="validateTags"></textarea></p> 
    <p><textarea name="description" data-validation="validateDescription"></textarea></p> 
    <p><button type="submit">Submit</button> 
</form> 

JS

var Validator = function(form) { 
    this.form = $(form); 
} 
$.extend(Validator.prototype, { 
    valid: function() { 
    var self = this; 

    this.errors = {}; 

    this.form.find('[required]').each(function() { 
     self.validateRequired($(this)); 
    }); 

    this.form.find('[data-validation]').each(function() { 
     var el = $(this), 
      method = el.data('validation'); 

     self[method].call(self, el); 
    }); 

    return $.isEmptyObject(this.errors); 
    }, 

    validateRequired: function(input) { 
    if (input.val() === '') { 
     this.addError(input, 'is required'); 
    } 
    }, 

    validateDescription: function(input) { 
    if (input.val().length < 64) { 
     this.addError(input, 'must be at least 64 characters'); 
    } 
    }, 

    validateTags: function(input) { 
    var tags = input.val().split(/, ?/); 

    if (tags.length < 3) { 
     this.addError(input, 'must have at least 3 tags'); 
    } 
    }, 

    addError: function(input, error) { 
    var name = input.attr('name'); 
    this.errors[name] = this.errors[name] || []; 
    this.errors[name].push(error); 
    input.after('<span class="error">' + error + '</span>'); 
    } 
}); 

$('form#new_pic').on('submit', function(event) { 
    event.preventDefault(); 

    var form = $(this), 
     validator = new Validator(form); 

    form.find('.error').remove(); 

    if (validator.valid()) { 
    // continue with upload 
    alert('Go!'); 
    return true; 
    } else { 
    // complain 
    alert('Stop!'); 
    return false; 
    } 
});