Rails field_error_proc переопределяет переписку со структурой html - PullRequest
0 голосов
/ 26 октября 2018

В приложении rails я переопределяю field_error_proc, чтобы разрешить отображение встроенных ошибок, например так:

enter image description here

и код для этоговыглядит следующим образом

ActionView::Base.field_error_proc = proc { |html_tag, instance|
  html = %(<div class="field_with_errors">#{html_tag}</div>).html_safe

  form_fields = %w[textarea input select]

  elements = Nokogiri::HTML::DocumentFragment.parse(html_tag).css 'label, ' + form_fields.join(', ')

  elements.each do |e|
    next unless form_fields.include?(e.node_name)
    errors = [instance.error_message].flatten.uniq.collect { |error| "#{instance.method_name.humanize} #{error}" }
    html = %(<div class="field_with_errors">#{html_tag}</div><small class="form-text error-text">&nbsp;#{errors.join(', ')}</small>).html_safe
  end

  html
}

Это нормально работает для обычных входов, так как они обернуты нормально.

Проблема возникает, когда вход обернут вокруг чего-то, что я хотел бы field_with_errors div, чтобы обернуть его как выпадающий список select2 или пользовательскую группу ввода, например, так:

<div class="split-daterange-picker form-control daterange-picker" id="">
  <input class="start-date" placeholder="Requested Dates" type="text" name="housing_lead[start_date]"> 
  <span class="separator"></span>
  <input class="end-date" placeholder="Requested Dates" type="text" name="housing_lead[end_date]"> 
</div>

Я использую 2 ввода, которые по существу действуют как одно поле формы, например: enter image description here

Но проблема в том, что когда входы заключены в field_with_errors div, это выглядит следующим образом:

enter image description here

ЧтоПо сути, я бы хотел сделать обтекание split-daterange-picker в field_with_errors div, чтобы я мог соответствующим образом стилизовать и добавить сообщения об ошибках после этого.Как я могу это сделать

1 Ответ

0 голосов
/ 07 июня 2019

Я не знаю, как это сделать с ActionView::Base.field_error_proc.Но вы, вероятно, могли бы получить что-то, работающее со сборщиком пользовательских форм, как обсуждено в этот ответ .

class PrettyFormBuilder < ActionView::Helpers::FormBuilder  
  def split_daterange_picker(start_field, end_field, options = {})
    options[:wrapper_class] ||= []
    if @object.errors[start_field].present? || @object.errors[end_field].present?
      options[:wrapper_class] << 'field_with_errors'
    end
    datepickers = text_field(start_field) + text_field(end_field)
    @template.content_tag(:div, datepickers, class: options[:wrapper_class])
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...