validationエラー時にdivで囲わない

今はerror_message_onにhtml_tagというオプションが追加されて、好きなtagで囲めるようになりました。以下の記事のような対応は必要ありません。コメント感謝

railsのデフォのvalidationエラーはdivタグを使用する。

通常時

 <%= error_message_on "post", "title" %> =>
    <div class="formError">can't be empty</div>
 <%= text_field "post", "title", :size=>"20" %> =>
    <div class="fieldWithErrors">
        <input type="text" id="post_title" name="post[title]" size="20" value="#{@post.title}" />
    </div>

携帯の画面をつくっているとき、divを使われてしまうと改行してしまう。
docomoはtableタグが使えないので、tableタグで回避することもできない。

inputフィールドのdivタグ回避

active_record_helper.rbには

module ActionView
  class Base
    @@field_error_proc = 
            Proc.new{ |html_tag, instance| "<div class=\"fieldWithErrors\">#{html_tag}</div>" }
    cattr_accessor :field_error_proc
  end
  ...
end

と書かれているのでこいつを、environment.rbかapprication_controller.rbで

ActionView::Base.field_error_proc = Proc.new{ |html_tag, instance| "<span class=\"fieldWithErrors\">#{html_tag}</span>" }

としてやればspanタグで回避してもらえる。

errorメッセージのdivタグ回避

active_record_helper.rbで

87:       def error_message_on(object, method, prepend_text = "", append_text = "", css_class = "formError")
88:         if (obj = instance_variable_get("@#{object}")) && (errors = obj.errors.on(method))
89:           content_tag("div", "#{prepend_text}#{errors.is_a?(Array) ? errors.first : errors}#{append_text}", :class => css_class)
90:         else 
91:           ''
92:         end
93:       end

となっているので、これをapplication_helperでoverrideする。

def error_message_on(object, method, prepend_text = "", append_text = "", css_class = "formError")
  if (obj = instance_variable_get("@#{object}")) && (errors = obj.errors.on(method))
     content_tag("span", "#{prepend_text}#{errors.is_a?(Array) ? errors.first : errors}#{append_text}", :class => css_class)
  else 
  ''
  end
end

これでspanで囲んでくれるようになった。
ただし、style指定はできないので、そのときはerror_message_on_hogeとかつくって使えばよろし。