Simplify required "ActionView compliant" API

This commit is contained in:
Yehuda Katz
2009-07-19 21:53:02 +09:00
parent 1a2946a6d9
commit bb530923bc
5 changed files with 17 additions and 22 deletions

View File

@@ -8,12 +8,6 @@ module AbstractController
extlib_inheritable_accessor(:_helpers) { Module.new }
end
# Override AbstractController::Renderer's _action_view to include the
# helper module for this class into its helpers module.
def _action_view
@_action_view ||= super.tap { |av| av.helpers.include(_helpers) }
end
module ClassMethods
# When a class is inherited, wrap its helper module in a new module.
# This ensures that the parent class's module can be changed

View File

@@ -17,25 +17,22 @@ module AbstractController
# An instance of a view class. The default view class is ActionView::Base
#
# The view class must have the following methods:
# initialize[paths, assigns_for_first_render, controller]
# paths<Array[ViewPath]>:: A list of resolvers to look for templates in
# controller<AbstractController::Base> A controller
# _render_partial_from_controller[options]
# View.for_controller[controller] Create a new ActionView instance for a
# controller
# View#_render_partial_from_controller[options]
# - responsible for setting options[:_template]
# - Returns String with the rendered partial
# options<Hash>:: see _render_partial in ActionView::Base
# _render_template_from_controller[template, layout, options, partial]
# View#_render_template_from_controller[template, layout, options, partial]
# - Returns String with the rendered template
# template<ActionView::Template>:: The template to render
# layout<ActionView::Template>:: The layout to render around the template
# options<Hash>:: See _render_template_with_layout in ActionView::Base
# partial<Boolean>:: Whether or not the template to render is a partial
# _partial:: If a partial, rather than a template, was rendered, return
# the partial.
# helpers:: A module containing the helpers to be used in the view. This
# module should respond_to include.
# controller:: The controller that initialized the ActionView
#
# Override this method in a to change the default behavior.
def _action_view
@_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
@_action_view ||= ActionView::Base.for_controller(self)
end
# Mostly abstracts the fact that calling render twice is a DoubleRenderError.

View File

@@ -228,6 +228,12 @@ module ActionView #:nodoc:
end
end
def self.for_controller(controller)
new(controller.class.view_paths, {}, controller).tap do |view|
view.helpers.include(controller._helpers) if controller.respond_to?(:_helpers)
end
end
def initialize(view_paths = [], assigns_for_first_render = {}, controller = nil, formats = nil)#:nodoc:
@formats = formats || [:html]
@assigns = assigns_for_first_render.each { |key, value| instance_variable_set("@#{key}", value) }

View File

@@ -259,7 +259,7 @@ module ActionView
_set_locals(object, locals, template, options)
self._partial = template
options[:_template] = template
_render_template(template, locals)
end
@@ -278,7 +278,7 @@ module ActionView
locals = (options[:locals] ||= {})
index, @_partial_path = 0, nil
collection.map do |object|
template = passed_template || begin
options[:_template] = template = passed_template || begin
_partial_path =
ActionController::RecordIdentifier.partial_path(object, controller_path)
template = _pick_partial_template(_partial_path)
@@ -289,8 +289,6 @@ module ActionView
index += 1
self._partial = template
_render_template(template, locals)
end.join(spacer)
end

View File

@@ -97,7 +97,7 @@ module ActionController
partials = hax[:partials]
if expected_count = options[:count]
found = partials.detect { |p, _| p.identifier.match(expected_partial) }
actual_count = found.nil? ? 0 : found.second
actual_count = found.nil? ? 0 : found[1]
msg = build_message(message,
"expecting ? to be rendered ? time(s) but rendered ? time(s)",
expected_partial, expected_count, actual_count)