From 334983eca042b5016d3d79d7ed5761b60ba871ed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Rodri=CC=81guez=20Troitin=CC=83o?= Date: Mon, 15 Mar 2010 19:11:46 +0100 Subject: Recovers error_messages for ActiveRecordInstanceTag. [#4078 state:resolved] Signed-off-by: wycats --- actionpack/lib/action_view/helpers/active_model_helper.rb | 4 ++++ actionpack/test/template/active_model_helper_test.rb | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/actionpack/lib/action_view/helpers/active_model_helper.rb b/actionpack/lib/action_view/helpers/active_model_helper.rb index e3db2923f7..bbe8609e91 100644 --- a/actionpack/lib/action_view/helpers/active_model_helper.rb +++ b/actionpack/lib/action_view/helpers/active_model_helper.rb @@ -295,6 +295,10 @@ module ActionView end end + def error_message + object.errors[@method_name] + end + def column_type object.send(:column_for_attribute, @method_name).type end diff --git a/actionpack/test/template/active_model_helper_test.rb b/actionpack/test/template/active_model_helper_test.rb index 371aa53c68..71c7d5b621 100644 --- a/actionpack/test/template/active_model_helper_test.rb +++ b/actionpack/test/template/active_model_helper_test.rb @@ -147,6 +147,20 @@ class ActiveModelHelperTest < ActionView::TestCase ) end + def test_field_error_proc + old_proc = ActionView::Base.field_error_proc + ActionView::Base.field_error_proc = Proc.new do |html_tag, instance| + %(
#{html_tag} #{[instance.error_message].join(', ')}
).html_safe + end + + assert_dom_equal( + %(
can't be empty
), + text_field("post", "author_name") + ) + ensure + ActionView::Base.field_error_proc = old_proc if old_proc + end + def test_form_with_string assert_dom_equal( %(


\n


), -- cgit v1.2.3 From b081948bb3e1a6874f133140bf07e7fb9d3359d9 Mon Sep 17 00:00:00 2001 From: Kabari Hendrick Date: Sun, 14 Mar 2010 01:33:45 -0600 Subject: fixing inconsistency with cattr_reader and matter_reader [#4172 state:resolved] Signed-off-by: wycats --- .../active_support/core_ext/class/attribute_accessors.rb | 13 ++++++++----- .../active_support/core_ext/module/attribute_accessors.rb | 14 +++++++++----- .../test/core_ext/class/attribute_accessor_test.rb | 8 +++++++- .../test/core_ext/module/attribute_accessor_test.rb | 6 ++++++ 4 files changed, 30 insertions(+), 11 deletions(-) diff --git a/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb b/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb index 1602a609eb..83d154be5c 100644 --- a/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb +++ b/activesupport/lib/active_support/core_ext/class/attribute_accessors.rb @@ -10,8 +10,8 @@ require 'active_support/core_ext/array/extract_options' # Person.hair_colors = [:brown, :black, :blonde, :red] class Class def cattr_reader(*syms) + options = syms.extract_options! syms.flatten.each do |sym| - next if sym.is_a?(Hash) class_eval(<<-EOS, __FILE__, __LINE__ + 1) unless defined? @@#{sym} # unless defined? @@hair_colors @@#{sym} = nil # @@hair_colors = nil @@ -19,12 +19,15 @@ class Class # def self.#{sym} # def self.hair_colors @@#{sym} # @@hair_colors - end # end - # - def #{sym} # def hair_colors - @@#{sym} # @@hair_colors end # end EOS + unless options[:instance_reader] == false + class_eval(<<-EOS, __FILE__, __LINE__) + def #{sym} # def hair_colors + @@#{sym} # @@hair_colors + end # end + EOS + end end end diff --git a/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb b/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb index 131b512944..c315fd5812 100644 --- a/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb +++ b/activesupport/lib/active_support/core_ext/module/attribute_accessors.rb @@ -2,7 +2,7 @@ require 'active_support/core_ext/array/extract_options' class Module def mattr_reader(*syms) - syms.extract_options! + options = syms.extract_options! syms.each do |sym| class_eval(<<-EOS, __FILE__, __LINE__ + 1) unless defined? @@#{sym} # unless defined? @@pagination_options @@ -12,11 +12,15 @@ class Module def self.#{sym} # def self.pagination_options @@#{sym} # @@pagination_options end # end - - def #{sym} # def pagination_options - @@#{sym} # @@pagination_options - end # end EOS + + unless options[:instance_reader] == false + class_eval(<<-EOS, __FILE__, __LINE__) + def #{sym} # def hair_colors + @@#{sym} # @@hair_colors + end # end + EOS + end end end diff --git a/activesupport/test/core_ext/class/attribute_accessor_test.rb b/activesupport/test/core_ext/class/attribute_accessor_test.rb index 2214ba9894..0f579d12e5 100644 --- a/activesupport/test/core_ext/class/attribute_accessor_test.rb +++ b/activesupport/test/core_ext/class/attribute_accessor_test.rb @@ -5,7 +5,8 @@ class ClassAttributeAccessorTest < Test::Unit::TestCase def setup @class = Class.new do cattr_accessor :foo - cattr_accessor :bar, :instance_writer => false + cattr_accessor :bar, :instance_writer => false + cattr_reader :shaq, :instance_reader => false end @object = @class.new end @@ -29,4 +30,9 @@ class ClassAttributeAccessorTest < Test::Unit::TestCase assert @object.respond_to?(:bar) assert !@object.respond_to?(:bar=) end + + def test_should_not_create_instance_reader + assert @class.respond_to?(:shaq) + assert !@object.respond_to?(:shaq) + end end diff --git a/activesupport/test/core_ext/module/attribute_accessor_test.rb b/activesupport/test/core_ext/module/attribute_accessor_test.rb index bd9461e62c..263e78feaa 100644 --- a/activesupport/test/core_ext/module/attribute_accessor_test.rb +++ b/activesupport/test/core_ext/module/attribute_accessor_test.rb @@ -6,6 +6,7 @@ class ModuleAttributeAccessorTest < Test::Unit::TestCase m = @module = Module.new do mattr_accessor :foo mattr_accessor :bar, :instance_writer => false + mattr_reader :shaq, :instance_reader => false end @class = Class.new @class.instance_eval { include m } @@ -31,4 +32,9 @@ class ModuleAttributeAccessorTest < Test::Unit::TestCase assert @object.respond_to?(:bar) assert !@object.respond_to?(:bar=) end + + def test_should_not_create_instance_reader + assert @module.respond_to?(:shaq) + assert !@object.respond_to?(:shaq) + end end -- cgit v1.2.3 From a24a888afe5652e391ce2ea682596686af5ec58b Mon Sep 17 00:00:00 2001 From: wycats Date: Sat, 27 Mar 2010 02:59:10 -0700 Subject: Limit Array#extract_options! to directl instances of Hash and HWIA. Add extractable_options? to Hash so that subclasses of Hash can opt-into extractable behavior. This fixes an issue where respond_with wasn't working with subclasses of Hash that were provided by other libraries (such as CouchDB or Mashie) [#4145 state:resolved] --- .../core_ext/array/extract_options.rb | 17 ++++++++++- .../active_support/hash_with_indifferent_access.rb | 4 +++ activesupport/test/core_ext/array_ext_test.rb | 34 ++++++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/activesupport/lib/active_support/core_ext/array/extract_options.rb b/activesupport/lib/active_support/core_ext/array/extract_options.rb index 9ca32dc7aa..40ceb3eb9e 100644 --- a/activesupport/lib/active_support/core_ext/array/extract_options.rb +++ b/activesupport/lib/active_support/core_ext/array/extract_options.rb @@ -1,3 +1,14 @@ +class Hash + # By default, only instances of Hash itself are extractable. + # Subclasses of Hash may implement this method and return + # true to declare themselves as extractable. If a Hash + # is extractable, Array#extract_options! pops it from + # the Array when it is the last element of the Array. + def extractable_options? + instance_of?(Hash) + end +end + class Array # Extracts options from a set of arguments. Removes and returns the last # element in the array if it's a hash, otherwise returns a blank hash. @@ -9,6 +20,10 @@ class Array # options(1, 2) # => {} # options(1, 2, :a => :b) # => {:a=>:b} def extract_options! - last.is_a?(::Hash) ? pop : {} + if last.is_a?(Hash) && last.extractable_options? + pop + else + {} + end end end diff --git a/activesupport/lib/active_support/hash_with_indifferent_access.rb b/activesupport/lib/active_support/hash_with_indifferent_access.rb index 543dab4a75..8241b69c8b 100644 --- a/activesupport/lib/active_support/hash_with_indifferent_access.rb +++ b/activesupport/lib/active_support/hash_with_indifferent_access.rb @@ -4,6 +4,10 @@ module ActiveSupport class HashWithIndifferentAccess < Hash + def extractable_options? + true + end + def initialize(constructor = {}) if constructor.is_a?(Hash) super() diff --git a/activesupport/test/core_ext/array_ext_test.rb b/activesupport/test/core_ext/array_ext_test.rb index b374eca370..aecc644549 100644 --- a/activesupport/test/core_ext/array_ext_test.rb +++ b/activesupport/test/core_ext/array_ext_test.rb @@ -4,6 +4,7 @@ require 'active_support/core_ext/big_decimal' require 'active_support/core_ext/object/conversions' require 'active_support/core_ext' # FIXME: pulling in all to_xml extensions +require 'active_support/hash_with_indifferent_access' class ArrayExtAccessTests < Test::Unit::TestCase def test_from @@ -294,12 +295,45 @@ class ArrayToXmlTests < Test::Unit::TestCase end class ArrayExtractOptionsTests < Test::Unit::TestCase + class HashSubclass < Hash + end + + class ExtractableHashSubclass < Hash + def extractable_options? + true + end + end + def test_extract_options assert_equal({}, [].extract_options!) assert_equal({}, [1].extract_options!) assert_equal({:a=>:b}, [{:a=>:b}].extract_options!) assert_equal({:a=>:b}, [1, {:a=>:b}].extract_options!) end + + def test_extract_options_doesnt_extract_hash_subclasses + hash = HashSubclass.new + hash[:foo] = 1 + array = [hash] + options = array.extract_options! + assert_equal({}, options) + assert_equal [hash], array + end + + def test_extract_options_extracts_extractable_subclass + hash = ExtractableHashSubclass.new + hash[:foo] = 1 + array = [hash] + options = array.extract_options! + assert_equal({:foo => 1}, options) + assert_equal [], array + end + + def test_extract_options_extracts_hwia + hash = [{:foo => 1}.with_indifferent_access] + options = hash.extract_options! + assert_equal 1, options[:foo] + end end class ArrayUniqByTests < Test::Unit::TestCase -- cgit v1.2.3