Permalink
Browse files

Make the second argument to `attribute` optional

While working on updating Paper Trail for 5.1 compatibility, I noticed
that I was required to pass a second argument to `attribute`. I didn't
intend for this to be the case, as `attribute :foo` is totally
reasonable shorthand for "I want `attr_accessor :foo`, but also have it
work with things like `.attributes` and `ActiveRecord::Dirty`"
  • Loading branch information...
1 parent ef993d3 commit 1bdc395d956f789b6612796ac6f130cde90d3066 @sgrif sgrif committed Nov 30, 2016
@@ -1,3 +1,9 @@
+* Change the type argument of `ActiveRecord::Base#attribute` to be optional.
+ The default is now `ActiveRecord::Type::Value.new`, which provides no type
+ casting behavior.
+
+ *Sean Griffin*
+
* Fix that unsigned with zerofill is treated as signed.
Fixes #27125.
@@ -191,7 +191,7 @@ module ClassMethods
# tracking is performed. The methods +changed?+ and +changed_in_place?+
# will be called from ActiveModel::Dirty. See the documentation for those
# methods in ActiveModel::Type::Value for more details.
- def attribute(name, cast_type, **options)
+ def attribute(name, cast_type = Type::Value.new, **options)
name = name.to_s
reload_schema_from_cache
@@ -255,5 +255,13 @@ def deserialize(*)
assert_includes inspection, "non_existent_decimal"
end
+
+ test "attributes do not require a type" do
+ klass = Class.new(OverloadedType) do
+ attribute :no_type
+ end
+ assert_equal 1, klass.new(no_type: 1).no_type
+ assert_equal "foo", klass.new(no_type: "foo").no_type
+ end
end
end

0 comments on commit 1bdc395

Please sign in to comment.