Настройка Rails client_side_validation

Я использую гем client_side_validation и у меня есть вопрос: в моем client_side_validation.rb у меня есть

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
  unless html_tag =~ /^<label/
    %{<div class="field_with_errors">#{html_tag}<label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
  else
    %{<div class="field_with_errors">#{html_tag}</div>}.html_safe
  end
end

и на выходе у меня есть:

<div>
  Name:
   <br>
   <div class="field_with_errors">
     <input id="user_username" type="text" size="30" name="user[username]"data-validate="true">
     <label class="message" for="user_username">Only letters allowed</label>
   </div>
</div>

я не хочу использовать ярлык:

<label class="message" for="user_username">Only letters allowed</label>

как я могу получить что-то вроде этого:

<div class="message">Only letters allowed</div>

я попытался поместить в свой файл rb:

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
  unless html_tag =~ /^<label/
    %{<div class="field_with_errors">#{html_tag}<div class="message">#{instance.error_message.first}</div></div>}.html_safe
  else
    %{<div class="field_with_errors">#{html_tag}</div>}.html_safe
  end
end

и перезапустить сервер - но в этом случае я получил только пустой div с классом message

помогите, пожалуйста.. как изменить стандартную метку на Div?


person Dmytro Vasin    schedule 29.08.2012    source источник


Ответы (1)


Есть два шага для переопределения сообщений об ошибках в client_side_validations: вам нужно либо изменить ActionView::Base.field_error_proc, либо просто rails.validations.coffee (или JS).

Для того, что вы пытаетесь сделать, вам не нужны изменения field_error_proc. Вы можете сделать это следующим образом:

window.ClientSideValidations.formBuilders['ActionView::Helpers::FormBuilder'] = {
  add: function(element, settings, message) {
    $(element).after($('<div>').attr('class', 'message').html(message));
  },
  remove: function(element, settings) {
    $(element).next().remove();
  }
}
person d_ethier    schedule 18.11.2012
comment
Сообщение отображается три раза: ‹span class=message› не может быть оставлено пустым‹/span›‹span class=message› не может быть оставлено пустым‹/span›‹span class=message› не может быть оставлено пустым Также удаляются ‹/span› и другие классы, которые были раньше. - person Sachin Prasad; 02.01.2013
comment
Сачин, попробуйте использовать window.ClientSideValidations.callbacks.form.fail, который является обратным вызовом для всей формы. Методы add и remove для FormBuilder вызываются для каждого поля, которое не проверяется правильно, поэтому вы видите несколько полей. - person d_ethier; 28.05.2013