Skip to content

Commit

Permalink
testability changes to render_with. Added alternative usage (page.ren…
Browse files Browse the repository at this point in the history
…der_with) that doesn't use eval
  • Loading branch information
dcolthorp committed May 25, 2008
1 parent 1352d9b commit cbd5d95
Showing 1 changed file with 36 additions and 21 deletions.
57 changes: 36 additions & 21 deletions lib/render_with.rb
@@ -1,41 +1,56 @@
class Renderer class Renderer
include ActionController::UrlWriter include ActionController::UrlWriter

attr_reader :page


def initialize(context, generator_factory=ActionView::Helpers::PrototypeHelper::JavaScriptGenerator) def initialize(page=nil, context=nil)
# include_helpers_from(context) if context
@context = context @context = context
context.assigns.each_pair do |key,value|
instance_variable_set "@#{key}", value # allow an array of assignments to be passed in for testing
assigns = context.is_a?(Hash) ? context : context.assigns

assigns.each_pair do |key,value|
instance_variable_set "@#{key}", value
end
end

if page
@page = page
elsif context
@page = ActionView::Helpers::PrototypeHelper::JavaScriptGenerator.new(context){}
else
raise ArgumentError, "can't construct a page without a context"
end end
@page = generator_factory.new(context) {}
end end


def to_s def to_s
@page.to_s @page.to_s
end end


private private
# def include_helpers_from(context)
# context.extended_by.each do |mod|
# extend mod
# end
# end


def method_missing(*args, &block) def method_missing(*args, &block)
if @page.respond_to?(args.first) @context.send *args, &block
@page.send(*args, &block)
else
@context.send *args, &block
end
end end

end end


class ActionView::Base class ActionView::Base
def render_with(renderer_name, &block) def render_with(renderer_name, &block)
renderer = "#{renderer_name}_renderer".classify.constantize.new(@template)
yield renderer
page = eval("page", block.binding) page = eval("page", block.binding)
page << renderer.to_s renderer = "#{renderer_name}_renderer".classify.constantize.new(page, @template)
yield renderer
end end
end end

# Alternative way to use render_with. Doesn't rely on eval voodoo.
# example use:
# page.render_with :foo do |foo|
# foo.do_something_cool
# end
module ActionView::Helpers::PrototypeHelper::JavaScriptGenerator::GeneratorMethods
def render_with(renderer_name, &block)
renderer = "#{renderer_name}_renderer".classify.constantize.new(self, @context)
yield renderer
end
end

0 comments on commit cbd5d95

Please sign in to comment.