aboutsummaryrefslogtreecommitdiffstats
path: root/actionview/lib/action_view/helpers/active_model_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'actionview/lib/action_view/helpers/active_model_helper.rb')
-rw-r--r--actionview/lib/action_view/helpers/active_model_helper.rb49
1 files changed, 49 insertions, 0 deletions
diff --git a/actionview/lib/action_view/helpers/active_model_helper.rb b/actionview/lib/action_view/helpers/active_model_helper.rb
new file mode 100644
index 0000000000..d5222e3616
--- /dev/null
+++ b/actionview/lib/action_view/helpers/active_model_helper.rb
@@ -0,0 +1,49 @@
+require 'active_support/core_ext/module/attribute_accessors'
+require 'active_support/core_ext/enumerable'
+
+module ActionView
+ # = Active Model Helpers
+ module Helpers
+ module ActiveModelHelper
+ end
+
+ module ActiveModelInstanceTag
+ def object
+ @active_model_object ||= begin
+ object = super
+ object.respond_to?(:to_model) ? object.to_model : object
+ end
+ end
+
+ def content_tag(*)
+ error_wrapping(super)
+ end
+
+ def tag(type, options, *)
+ tag_generate_errors?(options) ? error_wrapping(super) : super
+ end
+
+ def error_wrapping(html_tag)
+ if object_has_errors?
+ Base.field_error_proc.call(html_tag, self)
+ else
+ html_tag
+ end
+ end
+
+ def error_message
+ object.errors[@method_name]
+ end
+
+ private
+
+ def object_has_errors?
+ object.respond_to?(:errors) && object.errors.respond_to?(:[]) && error_message.present?
+ end
+
+ def tag_generate_errors?(options)
+ options['type'] != 'hidden'
+ end
+ end
+ end
+end