diff --git a/lib/active_model/serializer.rb b/lib/active_model/serializer.rb index 5adf4049..8c177581 100644 --- a/lib/active_model/serializer.rb +++ b/lib/active_model/serializer.rb @@ -263,7 +263,7 @@ module ActiveModel end def attribute(attr, options={}) - self._attributes = _attributes.merge(attr => options[:key] || attr) + self._attributes = _attributes.merge(attr => options[:key] || attr.to_s.gsub(/\?$/, '').to_sym) unless method_defined?(attr) class_eval "def #{attr}() object.read_attribute_for_serialization(:#{attr}) end", __FILE__, __LINE__ diff --git a/test/serializer_test.rb b/test/serializer_test.rb index 4d02715e..bdd20ae3 100644 --- a/test/serializer_test.rb +++ b/test/serializer_test.rb @@ -908,4 +908,48 @@ class SerializerTest < ActiveModel::TestCase end assert_equal ActiveModel::Serializer, loaded end + + def tests_query_attributes_strip_question_mark + todo = Class.new do + def overdue? + true + end + + def read_attribute_for_serialization(name) + send name + end + end + + serializer = Class.new(ActiveModel::Serializer) do + attribute :overdue? + end + + actual = serializer.new(todo.new).as_json + + assert_equal({ + :overdue => true + }, actual) + end + + def tests_query_attributes_allow_key_option + todo = Class.new do + def overdue? + true + end + + def read_attribute_for_serialization(name) + send name + end + end + + serializer = Class.new(ActiveModel::Serializer) do + attribute :overdue?, :key => :foo + end + + actual = serializer.new(todo.new).as_json + + assert_equal({ + :foo => true + }, actual) + end end