2

今、私は自分の ActionView::Base.field_error_proc を

Proc.new do |html_tag, instance|
  if html_tag =~ /^<label/ or instance.respond_to?(:object_name)
    %{<div class="field_with_errors">#{html_tag}</div>}.html_safe
  else
    %{<div class="field_with_errors">#{html_tag}<br /><label for="#{instance.send(:tag_id)}" class="message">#{instance.error_message.first}</label></div>}.html_safe
  end

client_side_validations ジェムを使用したときに、いくつかのニーズに対応するためにこれを変更しました。

現在、'fields_with_error' div は html_tag (具体的にはエラー フィールド) を囲んでいます。私が知りたいのは、div class="fields_with_error" の位置を変更して、error_field を含む div の直後に配置できるかどうかです。

たとえば、

<div class="main_div">
  <%= password_field_tag 'secret', 'Your secret here' %>
</div>

次に、div class="fields_with_error" を次のように配置する必要があります

<div class="main_div">
  <%= password_field_tag 'secret', 'Your secret here' %>
</div>
<div class="fields_with_error"> <label class="message"> The error message </label> </div>

どんな助けも非常に価値があります。

4

1 に答える 1

10

だから私がTwitterのブートストラップを扱うとき、私は通常、このようなもので初期化子を作ります

ActionView::Base.field_error_proc = Proc.new do |html_tag, instance|
  html = %(<div class="field_with_errors">#{html_tag}</div>).html_safe
  # add nokogiri gem to Gemfile

  form_fields = [
    'textarea',
    'input',
    'select'
  ]

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

  elements.each do |e|
    if e.node_name.eql? 'label'
      html = %(<div class="control-group error">#{e}</div>).html_safe
    elsif form_fields.include? e.node_name
      if instance.error_message.kind_of?(Array)
        html = %(<div class="control-group error">#{html_tag}<span class="help-inline">&nbsp;#{instance.error_message.uniq.join(', ')}</span></div>).html_safe
      else
        html = %(<div class="control-group error">#{html_tag}<span class="help-inline">&nbsp;#{instance.error_message}</span></div>).html_safe
      end
    end
  end
  html
end

これは、通常のエラーをフォームの twitter エラーに調整するだけです:> したがって、すべてが非常に見やすくなります;>. 同じアプローチを使用できます。

これが役に立ったら乾杯

于 2012-12-17T09:13:09.107 に答える