aboutsummaryrefslogtreecommitdiffstats
path: root/activemodel/lib/active_model/serializer.rb
diff options
context:
space:
mode:
authorJosé Valim <jose.valim@gmail.com>2009-07-04 20:16:36 +0200
committerJosé Valim <jose.valim@gmail.com>2009-07-04 20:16:36 +0200
commit20e2140ce7cd6ece8769fb09a7e615e961446b02 (patch)
tree2bf6a38b51863d86b195551ed740bde719c9d460 /activemodel/lib/active_model/serializer.rb
parent44633dc7a587424d21917413500b2d71fa3d31bb (diff)
parent783db25e0c640c1588732967a87d65c10fddc08e (diff)
downloadrails-20e2140ce7cd6ece8769fb09a7e615e961446b02.tar.gz
rails-20e2140ce7cd6ece8769fb09a7e615e961446b02.tar.bz2
rails-20e2140ce7cd6ece8769fb09a7e615e961446b02.zip
Merge branch 'master' of git://github.com/rails/rails
Diffstat (limited to 'activemodel/lib/active_model/serializer.rb')
-rw-r--r--activemodel/lib/active_model/serializer.rb60
1 files changed, 60 insertions, 0 deletions
diff --git a/activemodel/lib/active_model/serializer.rb b/activemodel/lib/active_model/serializer.rb
new file mode 100644
index 0000000000..5b603bdbd7
--- /dev/null
+++ b/activemodel/lib/active_model/serializer.rb
@@ -0,0 +1,60 @@
+require 'active_support/core_ext/hash/except'
+require 'active_support/core_ext/hash/slice'
+
+module ActiveModel
+ class Serializer
+ attr_reader :options
+
+ def initialize(serializable, options = nil)
+ @serializable = serializable
+ @options = options ? options.dup : {}
+
+ @options[:only] = Array.wrap(@options[:only]).map { |n| n.to_s }
+ @options[:except] = Array.wrap(@options[:except]).map { |n| n.to_s }
+ end
+
+ def serialize
+ raise NotImplemented
+ end
+
+ def to_s(&block)
+ serialize(&block)
+ end
+
+ # To replicate the behavior in ActiveRecord#attributes,
+ # <tt>:except</tt> takes precedence over <tt>:only</tt>. If <tt>:only</tt> is not set
+ # for a N level model but is set for the N+1 level models,
+ # then because <tt>:except</tt> is set to a default value, the second
+ # level model can have both <tt>:except</tt> and <tt>:only</tt> set. So if
+ # <tt>:only</tt> is set, always delete <tt>:except</tt>.
+ def serializable_attribute_names
+ attribute_names = @serializable.attributes.keys.sort
+
+ if options[:only].any?
+ attribute_names &= options[:only]
+ elsif options[:except].any?
+ attribute_names -= options[:except]
+ end
+
+ attribute_names
+ end
+
+ def serializable_method_names
+ Array.wrap(options[:methods]).inject([]) do |methods, name|
+ methods << name if @serializable.respond_to?(name.to_s)
+ methods
+ end
+ end
+
+ def serializable_names
+ serializable_attribute_names + serializable_method_names
+ end
+
+ def serializable_hash
+ serializable_names.inject({}) { |hash, name|
+ hash[name] = @serializable.send(name)
+ hash
+ }
+ end
+ end
+end