module Errors2Html VERSION = '1.4.0' def Errors2Html.version Errors2Html::VERSION end def Errors2Html.dependencies { 'fattr' => [ 'fattr' , ' >= 2.2.1' ], 'map' => [ 'map' , ' >= 6.2.0' ], 'rails_view' => [ 'rails_view' , ' >= 1.0.1' ] } end begin require 'rubygems' rescue LoadError nil end Errors2Html.dependencies.each do |lib, dependency| gem(*dependency) if defined?(gem) require(lib) end def Errors2Html.to_html(*args) if args.size == 1 case args.first when Array, String, Symbol messages = Array(args.first) args = [{:base => messages}] end end args.flatten! args.compact! at_least_one_error = false errors = Map.new errors[:global] = [] errors[:fields] = {} args.each do |e| flatten(e).each do |key, messages| Array(messages).each do |message| at_least_one_error = true if Array(key).join =~ /\A(?:[*]|base)\Z/iomx errors.global.push(message.to_s).uniq! else (errors.fields[key] ||= []).push(message.to_s).uniq! end end end end return "" unless at_least_one_error locals = { :errors => errors, :global_errors => errors.global, :fields_errors => errors.fields } if template View.render(:template => template, :locals => locals) else View.render(:inline => inline, :locals => locals) end end def Errors2Html.flatten(hashlike) case hashlike when Map hash = Hash.new hashlike.depth_first_each do |key, value| index = key.pop if key.last.is_a?(Integer) (hash[key] ||= []).push(value) end hash else hashlike.respond_to?(:to_hash) ? hashlike.to_hash : hashlike end end Fattr(:inline) do <<-erb

Sorry, we encountered some errors:

<% unless errors.global.empty? %> <% end %> <% unless errors.fields.empty? %>
<% errors.fields.each do |key, messages| title = Array(key).join(" ").titleize %>
<%= title %>
<% Array(messages).each do |message| %>
<%= message %>
<% end %> <% end %>
<% end %>
erb end Fattr(:template){ nil } module Mixin def to_html ::Errors2Html.to_html(self) end def to_s to_html end end end ## # require 'active_model' unless defined?(ActiveModel) ActiveModel::Errors.send(:include, Errors2Html::Mixin) ActiveModel::Errors.class_eval do def inspect(*args, &block) to_hash.inspect(*args, &block) end end