Skip to content
This repository has been archived by the owner on May 8, 2022. It is now read-only.

Commit

Permalink
Created DynamicErrors
Browse files Browse the repository at this point in the history
  • Loading branch information
joelmoss committed Aug 9, 2010
1 parent fec6401 commit c9d81c9
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 1 deletion.
1 change: 0 additions & 1 deletion dynamic_form.gemspec
Expand Up @@ -23,7 +23,6 @@ Gem::Specification.new do |s|
"README",
"Rakefile",
"VERSION",
"dynamic-form.gemspec",
"dynamic_form.gemspec",
"init.rb",
"lib/action_view/helpers/dynamic_form.rb",
Expand Down
47 changes: 47 additions & 0 deletions lib/active_model/dynamic_errors.rb
@@ -0,0 +1,47 @@
module ActiveModel
class Errors
# Redefine the ActiveModel::Errors::full_messages method:
# Returns all the full error messages in an array. 'Base' messages are handled as usual.
# Non-base messages are prefixed with the attribute name as usual UNLESS
# (1) they begin with '^' in which case the attribute name is omitted.
# E.g. validates_acceptance_of :accepted_terms, :message => '^Please accept the terms of service'
# (2) the message is a proc, in which case the proc is invoked on the model object.
# E.g. validates_presence_of :assessment_answer_option_id,
# :message => Proc.new { |aa| "#{aa.label} (#{aa.group_label}) is required" }
# which gives an error message like:
# Rate (Accuracy) is required
def full_messages
full_messages = []

each do |attribute, messages|
messages = Array.wrap(messages)
next if messages.empty?

if attribute == :base
messages.each {|m| full_messages << m }
else
attr_name = attribute.to_s.gsub('.', '_').humanize
attr_name = @base.class.human_attribute_name(attribute, :default => attr_name)
options = { :default => "%{attribute} %{message}", :attribute => attr_name }

messages.each do |m|
if m =~ /^\^/
options[:default] = "%{message}"
full_messages << I18n.t(:"errors.dynamic_format", options.merge(:message => m[1..-1]))
elsif m.is_a? Proc
options[:default] = "%{message}"
full_messages << I18n.t(:"errors.dynamic_format", options.merge(:message => m.call(@base)))
else
full_messages << I18n.t(:"errors.format", options.merge(:message => m))
end
end
end
end

full_messages
end
end
end

require 'active_support/i18n'
I18n.load_path << File.dirname(__FILE__) + '/locale/en.yml'
4 changes: 4 additions & 0 deletions lib/active_model/locale/en.yml
@@ -0,0 +1,4 @@
en:
errors:
# The default format to use in full dynamic error messages.
dynamic_format: "%{message}"
1 change: 1 addition & 0 deletions lib/dynamic_form.rb
@@ -1,3 +1,4 @@
require "active_model/dynamic_errors"
require 'action_view/helpers/dynamic_form'

class ActionView::Base
Expand Down
6 changes: 6 additions & 0 deletions test/dynamic_form_test.rb
Expand Up @@ -369,4 +369,10 @@ def test_default_form_builder_no_instance_variable

assert_dom_equal expected, output_buffer
end

def test_error_messages_without_prefixed_attribute_name
error = error_messages_for(@post)
assert_dom_equal %(<div class="errorExplanation" id="errorExplanation"><h2>1 error prohibited this post from being saved</h2><p>There were problems with the following fields:</p><ul><li>Author name can't be empty</li></ul></div>),
error
end
end

0 comments on commit c9d81c9

Please sign in to comment.