diff options
author | José Valim <jose.valim@gmail.com> | 2009-07-04 20:16:36 +0200 |
---|---|---|
committer | José Valim <jose.valim@gmail.com> | 2009-07-04 20:16:36 +0200 |
commit | 20e2140ce7cd6ece8769fb09a7e615e961446b02 (patch) | |
tree | 2bf6a38b51863d86b195551ed740bde719c9d460 /activemodel/lib/active_model/serializer.rb | |
parent | 44633dc7a587424d21917413500b2d71fa3d31bb (diff) | |
parent | 783db25e0c640c1588732967a87d65c10fddc08e (diff) | |
download | rails-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.rb | 60 |
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 |