Railsでは、バリデーションエラーが発生した場合、デフォルトで.field_with_errors
というクラスがついたdivで囲んだ状態でラベルとフォームの要素(input, textarea, select)などを出力する。
それを変更したい場合は、application.rb
内でconfig.action_view.field_error_proc
にProcを渡してやれば良い。
やりたいこと
エラーがある場合、クラスを付与したdivでその要素を囲むのではなく、その要素自体にクラスを付与したい。
実装
application.rb
config.action_view.field_error_proc = Proc.new do |html_tag, instance|
if instance.kind_of?(ActionView::Helpers::Tags::Label)
html_tag.html_safe
else
Nokogiri::HTML.fragment(html_tag).search('input', 'textarea', 'select').add_class('is-error').to_html.html_safe
end
end
やっていること
・instance.kind_of?(ActionView::Helpers::Tags::Label)
で、labelタグかどうか調べている。ラベルなら何もしない。
・それ以外の場合、Nokogiriでhtml_tag
をパースし、クラスを付与する。