aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYves Senn <yves.senn@gmail.com>2014-01-11 12:57:09 +0100
committerYves Senn <yves.senn@gmail.com>2014-01-11 12:57:09 +0100
commit792c66f868b27cfd4b71c541202caae4bee1d172 (patch)
treea86bee9c33a7c6e750d35c31ee97e87db5905e3d
parentcaa981d88112f019ade868f75af6b5f399c244a4 (diff)
downloadrails-792c66f868b27cfd4b71c541202caae4bee1d172.tar.gz
rails-792c66f868b27cfd4b71c541202caae4bee1d172.tar.bz2
rails-792c66f868b27cfd4b71c541202caae4bee1d172.zip
use enum labels as form values. Achieved by `_before_type_cast`.
Closes #13650, #13672 This is an alternate implementation to solve #13650. Currently form fields contain the enum value (eg. "1"). This breaks because the setter `enum=` expects the label (eg. "active"). ActiveRecord::Enum allows you to use labels in your application but store numbers. We should make sure that all parts after AR are dealing with labels and not the underlying mapping to a number. This patch defines `_before_type_cast` on every enum column to return the label. This method is later used to fetch the value to display in form fields. I deliberately copied the implementation of the enum getter instead of delegating to it. This allows you to overwrite the getter and for example return a `Value Object` but have it still work for form fields.
-rw-r--r--activerecord/lib/active_record/enum.rb3
-rw-r--r--activerecord/test/cases/enum_test.rb4
2 files changed, 7 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/enum.rb b/activerecord/lib/active_record/enum.rb
index 9ad718a02a..d1bc785bee 100644
--- a/activerecord/lib/active_record/enum.rb
+++ b/activerecord/lib/active_record/enum.rb
@@ -87,6 +87,9 @@ module ActiveRecord
# def status() STATUS.key self[:status] end
define_method(name) { enum_values.key self[name] }
+ # def status_before_type_cast() STATUS.key self[:status] end
+ define_method("#{name}_before_type_cast") { enum_values.key self[name] }
+
pairs = values.respond_to?(:each_pair) ? values.each_pair : values.each_with_index
pairs.each do |value, i|
enum_values[value] = i
diff --git a/activerecord/test/cases/enum_test.rb b/activerecord/test/cases/enum_test.rb
index c09e58fbf1..0075df8b8d 100644
--- a/activerecord/test/cases/enum_test.rb
+++ b/activerecord/test/cases/enum_test.rb
@@ -88,4 +88,8 @@ class EnumTest < ActiveRecord::TestCase
assert Book.written.create.written?
assert Book.read.create.read?
end
+
+ test "_before_type_cast returns the enum label (required for form fields)" do
+ assert_equal "proposed", @book.status_before_type_cast
+ end
end