Skip to content

Commit ebad4e6

Browse files
committed
Check invalid enum options for the new syntax
The options using `_` prefix in the old syntax are invalid in the new syntax. We should raise an error when using them. Fixes rails#52586.
1 parent 455cf48 commit ebad4e6

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

activerecord/lib/active_record/enum.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,7 @@ def inherited(base)
240240

241241
def _enum(name, values, prefix: nil, suffix: nil, scopes: true, instance_methods: true, validate: false, **options)
242242
assert_valid_enum_definition_values(values)
243+
assert_valid_enum_options(options)
243244
# statuses = { }
244245
enum_values = ActiveSupport::HashWithIndifferentAccess.new
245246
name = name.to_s
@@ -370,6 +371,13 @@ def assert_valid_enum_definition_values(values)
370371
end
371372
end
372373

374+
def assert_valid_enum_options(options)
375+
invalid_keys = options.keys & %i[_prefix _suffix _scopes _default _instance_methods]
376+
unless invalid_keys.empty?
377+
raise ArgumentError, "invalid option(s): #{invalid_keys.map(&:inspect).join(", ")}. Valid options are: :prefix, :suffix, :scopes, :default, :instance_methods, and :validate."
378+
end
379+
end
380+
373381
ENUM_CONFLICT_MESSAGE = \
374382
"You tried to define an enum named \"%{enum}\" on the model \"%{klass}\", but " \
375383
"this will generate a %{type} method \"%{method}\", which is already defined " \

activerecord/test/cases/enum_test.rb

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -868,6 +868,61 @@ def self.name; "Book"; end
868868
assert_equal "published", klass.new.status
869869
end
870870

871+
test ":_default is invalid in the new API" do
872+
error = assert_raises(ArgumentError) do
873+
Class.new(ActiveRecord::Base) do
874+
self.table_name = "books"
875+
enum :status, [:proposed, :written, :published], _default: :published
876+
end
877+
end
878+
879+
assert_match(/invalid option\(s\): :_default/, error.message)
880+
end
881+
882+
test ":_prefix is invalid in the new API" do
883+
error = assert_raises(ArgumentError) do
884+
Class.new(ActiveRecord::Base) do
885+
self.table_name = "books"
886+
enum :status, [:proposed, :written, :published], _prefix: true
887+
end
888+
end
889+
890+
assert_match(/invalid option\(s\): :_prefix/, error.message)
891+
end
892+
893+
test ":_suffix is invalid in the new API" do
894+
error = assert_raises(ArgumentError) do
895+
Class.new(ActiveRecord::Base) do
896+
self.table_name = "books"
897+
enum :status, [:proposed, :written, :published], _suffix: true
898+
end
899+
end
900+
901+
assert_match(/invalid option\(s\): :_suffix/, error.message)
902+
end
903+
904+
test ":_scopes is invalid in the new API" do
905+
error = assert_raises(ArgumentError) do
906+
Class.new(ActiveRecord::Base) do
907+
self.table_name = "books"
908+
enum :status, [:proposed, :written, :published], _scopes: false
909+
end
910+
end
911+
912+
assert_match(/invalid option\(s\): :_scopes/, error.message)
913+
end
914+
915+
test ":_instance_methods is invalid in the new API" do
916+
error = assert_raises(ArgumentError) do
917+
Class.new(ActiveRecord::Base) do
918+
self.table_name = "books"
919+
enum :status, [:proposed, :written, :published], _instance_methods: false
920+
end
921+
end
922+
923+
assert_match(/invalid option\(s\): :_instance_methods/, error.message)
924+
end
925+
871926
test "scopes can be disabled by :scopes" do
872927
klass = Class.new(ActiveRecord::Base) do
873928
self.table_name = "books"

0 commit comments

Comments
 (0)