Merge pull request #283 from morgoth/add-only-and-except-options-support

Add only and except options support
This commit is contained in:
Steve Klabnik 2013-05-05 12:00:59 -07:00
commit cffdbce072
2 changed files with 56 additions and 5 deletions

View File

@ -363,6 +363,8 @@ module ActiveModel
end end
def include?(name) def include?(name)
return false if options.key?(:only) && !Array(options[:only]).include?(name)
return false if options.key?(:except) && Array(options[:except]).include?(name)
send INCLUDE_METHODS[name] send INCLUDE_METHODS[name]
end end

View File

@ -1390,4 +1390,53 @@ class SerializerTest < ActiveModel::TestCase
a_serializer = serializer.new(post, :scope => user, :scope_name => :current_user) a_serializer = serializer.new(post, :scope => user, :scope_name => :current_user)
assert a_serializer.has_permission? assert a_serializer.has_permission?
end end
def test_only_option_filters_attributes_and_associations
post = Post.new(:title => "New Post", :body => "Body of new post")
comments = [Comment.new(:title => "Comment1")]
post.comments = comments
post_serializer = PostSerializer.new(post, :only => :title)
assert_equal({
:post => {
:title => "New Post"
}
}, post_serializer.as_json)
end
def test_except_option_filters_attributes_and_associations
post = Post.new(:title => "New Post", :body => "Body of new post")
comments = [Comment.new(:title => "Comment1")]
post.comments = comments
post_serializer = PostSerializer.new(post, :except => [:body, :comments])
assert_equal({
:post => {
:title => "New Post"
}
}, post_serializer.as_json)
end
def test_only_option_takes_precedence_over_custom_defined_include_methods
user = User.new
post = Post.new(:title => "New Post", :body => "Body of new post", :author => "Sausage King")
comments = [Comment.new(:title => "Comment")]
post.comments = comments
post_serializer = PostWithMultipleConditionalsSerializer.new(post, :scope => user, :only => :title)
# comments enabled
post.comments_disabled = false
# superuser - should see author
user.superuser = true
assert_equal({
:post => {
:title => "New Post"
}
}, post_serializer.as_json)
end
end end