Skip to content

Commit

Permalink
Revert "Wrap relation calls and scope calls in decorators"
Browse files Browse the repository at this point in the history
This reverts commit e4595d9.

Fixes drapergem#267

Conflicts:

	lib/draper/base.rb
	lib/draper/decorated_enumerable_proxy.rb
	spec/draper/base_spec.rb
  • Loading branch information
steveklabnik committed Aug 31, 2012
1 parent 3a01322 commit 044a6e6
Show file tree
Hide file tree
Showing 3 changed files with 7 additions and 56 deletions.
15 changes: 4 additions & 11 deletions lib/draper/base.rb
Expand Up @@ -255,12 +255,7 @@ def method_missing(method, *args, &block)

if model.respond_to?(method)
self.class.send :define_method, method do |*args, &blokk|
result = model.send method, *args, &blokk
if defined?(ActiveRecord) && result.kind_of?(ActiveRecord::Relation)
self.class.new(model,self.options)
else
result
end
model.send method, *args, &blokk
end

send method, *args, &block
Expand All @@ -274,12 +269,10 @@ def method_missing(method, *args, &block)
end

def self.method_missing(method, *args, &block)
model_result = model_class.send(method, *args, &block)
if model_result.kind_of?(model_class) ||
(defined?(ActiveRecord) && model_result.kind_of?(ActiveRecord::Relation))
self.decorate(model_result, :context => args.dup.extract_options!)
if method.to_s.match(/^find_((all_|last_)?by_|or_(initialize|create)_by_).*/)
self.decorate(model_class.send(method, *args, &block), :context => args.dup.extract_options!)
else
model_result
model_class.send(method, *args, &block)
end
end

Expand Down
19 changes: 1 addition & 18 deletions lib/draper/decorated_enumerable_proxy.rb
Expand Up @@ -44,24 +44,7 @@ def find(ifnone_or_id = nil, &blk)
end

def method_missing (method, *args, &block)
if @wrapped_collection.respond_to?(method)
self.class.send :define_method, method do |*args, &blokk|
scoped_result = @wrapped_collection.send(method, *args, &block)
if defined?(ActiveRecord) && scoped_result.kind_of?(ActiveRecord::Relation)
self.class.new(scoped_result, @klass, @options)
else
scoped_result
end
end

send method, *args, &block
else
super
end

rescue NoMethodError => no_method_error
super if no_method_error.name == method
raise no_method_error
@wrapped_collection.send(method, *args, &block)
end

def respond_to?(method, include_private = false)
Expand Down
29 changes: 2 additions & 27 deletions spec/draper/base_spec.rb
Expand Up @@ -50,20 +50,6 @@
ProductDecorator.new(product_decorator).model.should be_instance_of Product
end

it "returns a Decorator when a scope is called on decorated object" do
proxy = ProductDecorator.new(source)
klass = proxy.model.class
klass.class_eval { def some_scope ; ActiveRecord::Relation.new ; end }
proxy.some_scope.should be_instance_of(proxy.class)
end

it "returns a Decorator when a scope is called on the decorator" do
proxy = ProductDecorator
klass = source.class
klass.class_eval { def self.some_scope ; ActiveRecord::Relation.new ; end }
proxy.some_scope.should be_instance_of(proxy)
end

it "handle plural-like words properly'" do
class Business; end
expect do
Expand Down Expand Up @@ -176,18 +162,6 @@ class CustomDecorator < Draper::Base
end
end

context "with a scope applied after decoration" do
it "returns a DecoratedEnumerableProxy when a scope is called" do
class ActiveRecord::Relation
def some_scope; self ;end
end
klass = subject.model.class
klass.class_eval { def self.some_scope ; ActiveRecord::Relation.new ; end }
proxy = Draper::DecoratedEnumerableProxy
proxy.new(ActiveRecord::Relation.new, klass).some_scope.should be_instance_of(proxy)
end
end

context "for a polymorphic association" do
before(:each){ subject.class_eval{ decorates_association :thing, :polymorphic => true } }
it "causes the association to be decorated with the right decorator" do
Expand Down Expand Up @@ -378,7 +352,8 @@ def some_scope; self ;end

it "uses the options hash in the decorator instantiation" do
Product.should_receive(:find_by_name_and_size).with("apples", "large", {:role => :admin})
ProductDecorator.find_by_name_and_size("apples", "large", {:role => :admin})
pd = ProductDecorator.find_by_name_and_size("apples", "large", {:role => :admin})
pd.context[:role].should == :admin
end
end

Expand Down

0 comments on commit 044a6e6

Please sign in to comment.