Created
September 4, 2010 08:00
-
-
Save MattHall/565009 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
module ErrorsHelper | |
def error_messages_for(*params) | |
options = params.extract_options!.symbolize_keys | |
if object = options.delete(:object) | |
objects = Array.wrap(object) | |
else | |
objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact | |
end | |
count = objects.inject(0) {|sum, object| sum + object.errors.count } | |
unless count.zero? | |
html = {} | |
[:id, :class].each do |key| | |
if options.include?(key) | |
value = options[key] | |
html[key] = value unless value.blank? | |
else | |
html[key] = 'errorExplanation' | |
end | |
end | |
options[:object_name] ||= params.first | |
I18n.with_options :locale => options[:locale], :scope => [:activerecord, :errors, :template] do |locale| | |
header_message = if options.include?(:header_message) | |
options[:header_message] | |
else | |
object_name = options[:object_name].to_s | |
object_name = I18n.t(object_name, :default => object_name.gsub('_', ' '), :scope => [:activerecord, :models], :count => 1) | |
locale.t :header, :count => count, :model => object_name | |
end | |
message = options.include?(:message) ? options[:message] : locale.t(:body) | |
error_messages = objects.sum do |object| | |
object.errors.on(:name) | |
full_flat_messages(object).map do |msg| | |
content_tag(:li, ERB::Util.html_escape(msg)) | |
end | |
end.join.html_safe | |
contents = '' | |
contents << content_tag(options[:header_tag] || :h2, header_message) unless header_message.blank? | |
contents << content_tag(:p, message) unless message.blank? | |
contents << content_tag(:ul, error_messages) | |
content_tag(:div, contents.html_safe, html) | |
end | |
else | |
'' | |
end | |
end | |
#################### | |
# | |
# added to make the errors display in a single line per field | |
# | |
#################### | |
def full_flat_messages(object) | |
message_bucket = {} | |
full_messages = [] | |
object.errors.each do |error| | |
if message_bucket[error[0].to_sym].nil? | |
message_bucket[error[0].to_sym] = true | |
full_messages << (error[0]).titleize + ' ' + error[1] | |
end | |
end | |
full_messages | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment