From 0aa95a71b04f2893921c58a7c1d9fca60dbdcbc2 Mon Sep 17 00:00:00 2001 From: Paul Nikitochkin Date: Tue, 23 Jul 2013 22:33:53 +0300 Subject: [PATCH] Rescue invalid ip address exceptions on assign. In order that set attribute should not be bang method --- activerecord/CHANGELOG.md | 18 ++++++++++++++++++ .../connection_adapters/postgresql/cast.rb | 6 +++++- .../cases/adapters/postgresql/datatype_test.rb | 14 ++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index e8ec99511ebf5..904ed0e36255c 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,21 @@ +* Assign inet/cidr attribute with `nil` value for invalid address. + + Example: + + record = User.new + + record.logged_in_from_ip # is type of an inet or a cidr + + # Before: + record.logged_in_from_ip = 'bad ip address' # raise exception + + # After: + record.logged_in_from_ip = 'bad ip address' # do not raise exception + record.logged_in_from_ip # => nil + record.logged_in_from_ip_before_type_cast # => 'bad ip address' + + *Paul Nikitochkin* + * `add_to_target` now accepts a second optional `skip_callbacks` argument If truthy, it will skip the :before_add and :after_add callbacks. diff --git a/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb b/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb index 56dc9ea813e45..ef7b976d4fc49 100644 --- a/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb +++ b/activerecord/lib/active_record/connection_adapters/postgresql/cast.rb @@ -100,7 +100,11 @@ def string_to_cidr(string) if string.nil? nil elsif String === string - IPAddr.new(string) + begin + IPAddr.new(string) + rescue ArgumentError + nil + end else string end diff --git a/activerecord/test/cases/adapters/postgresql/datatype_test.rb b/activerecord/test/cases/adapters/postgresql/datatype_test.rb index e946b8bb22401..7f4c287ec6ef6 100644 --- a/activerecord/test/cases/adapters/postgresql/datatype_test.rb +++ b/activerecord/test/cases/adapters/postgresql/datatype_test.rb @@ -558,6 +558,20 @@ def test_invalid_hex_string assert_raise(ActiveRecord::StatementInvalid) { assert @first_bit_string.save } end + def test_invalid_network_address + @first_network_address.cidr_address = 'invalid addr' + assert_nil @first_network_address.cidr_address + assert_equal 'invalid addr', @first_network_address.cidr_address_before_type_cast + assert @first_network_address.save + + @first_network_address.reload + + @first_network_address.inet_address = 'invalid addr' + assert_nil @first_network_address.inet_address + assert_equal 'invalid addr', @first_network_address.inet_address_before_type_cast + assert @first_network_address.save + end + def test_update_oid new_value = 567890 assert @first_oid.obj_id = new_value