Skip to content

Commit

Permalink
html_tag option to wrap error_message_on text [#4283 state:resolved]
Browse files Browse the repository at this point in the history
Signed-off-by: wycats <wycats@gmail.com>
  • Loading branch information
Paco Guzman authored and wycats committed Mar 29, 2010
1 parent 26bc5c5 commit 878a9e0
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
21 changes: 12 additions & 9 deletions actionpack/lib/action_view/helpers/active_model_helper.rb
Expand Up @@ -97,10 +97,10 @@ def form(record_name, options = {})
end

# Returns a string containing the error message attached to the +method+ on the +object+ if one exists.
# This error message is wrapped in a <tt>DIV</tt> tag, which can be extended to include a <tt>:prepend_text</tt>
# and/or <tt>:append_text</tt> (to properly explain the error), and a <tt>:css_class</tt> to style it
# accordingly. +object+ should either be the name of an instance variable or the actual object. The method can be
# passed in either as a string or a symbol.
# This error message is wrapped in a <tt>DIV</tt> tag by default or with <tt>:html_tag</tt> if specified,
# which can be extended to include a <tt>:prepend_text</tt> and/or <tt>:append_text</tt> (to properly explain
# the error), and a <tt>:css_class</tt> to style it accordingly. +object+ should either be the name of an
# instance variable or the actual object. The method can be passed in either as a string or a symbol.
# As an example, let's say you have a model <tt>@post</tt> that has an error message on the +title+ attribute:
#
# <%= error_message_on "post", "title" %>
Expand All @@ -112,25 +112,28 @@ def form(record_name, options = {})
# <%= error_message_on "post", "title",
# :prepend_text => "Title simply ",
# :append_text => " (or it won't work).",
# :html_tag => "span",
# :css_class => "inputError" %>
# # => <span class="inputError">Title simply can't be empty (or it won't work).</span>
def error_message_on(object, method, *args)
options = args.extract_options!
unless args.empty?
ActiveSupport::Deprecation.warn('error_message_on takes an option hash instead of separate ' +
'prepend_text, append_text, and css_class arguments', caller)
'prepend_text, append_text, html_tag, and css_class arguments', caller)

options[:prepend_text] = args[0] || ''
options[:append_text] = args[1] || ''
options[:css_class] = args[2] || 'formError'
options[:html_tag] = args[2] || 'div'
options[:css_class] = args[3] || 'formError'
end
options.reverse_merge!(:prepend_text => '', :append_text => '', :css_class => 'formError')
options.reverse_merge!(:prepend_text => '', :append_text => '', :html_tag => 'div', :css_class => 'formError')

object = convert_to_model(object)

if (obj = (object.respond_to?(:errors) ? object : instance_variable_get("@#{object}"))) &&
(errors = obj.errors[method]).presence
content_tag("div",
"#{options[:prepend_text]}#{ERB::Util.h(errors.first)}#{options[:append_text]}".html_safe,
content_tag(options[:html_tag],
(options[:prepend_text].html_safe << errors.first).safe_concat(options[:append_text]),
:class => options[:css_class]
)
else
Expand Down
4 changes: 4 additions & 0 deletions actionpack/test/template/active_model_helper_test.rb
Expand Up @@ -266,6 +266,10 @@ def test_error_message_on_with_options_hash
assert_dom_equal "<div class=\"differentError\">beforecan't be emptyafter</div>", error_message_on(:post, :author_name, :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after')
end

def test_error_message_on_with_tag_option_in_options_hash
assert_dom_equal "<span class=\"differentError\">beforecan't be emptyafter</span>", error_message_on(:post, :author_name, :html_tag => "span", :css_class => 'differentError', :prepend_text => 'before', :append_text => 'after')
end

def test_error_message_on_handles_empty_errors
assert_equal "", error_message_on(@post, :tag)
end
Expand Down

0 comments on commit 878a9e0

Please sign in to comment.