提交 890321e5 编写于 作者: Y Yehuda Katz

Get very basic layouts working.

* Required small architecture change
上级 8ab37c76
module AbstractController
module Layouts
def _render_template(tmp)
_action_view._render_template_with_layout(tmp, _layout)
end
def _layout
def _render_template(template, options)
_action_view._render_template_with_layout(template, options[:_layout])
end
end
end
\ No newline at end of file
......@@ -4,12 +4,14 @@ module AbstractController
module Renderer
def self.included(klass)
klass.class_eval do
klass.class_eval do
extend ClassMethods
attr_internal :formats
extlib_inheritable_accessor :view_paths
self.view_paths ||= ActionView::PathSet.new
extlib_inheritable_accessor :_view_paths
self._view_paths ||= ActionView::PathSet.new
include AbstractController::Logger
end
end
......@@ -17,27 +19,42 @@ def self.included(klass)
def _action_view
@_action_view ||= ActionView::Base.new(self.class.view_paths, {}, self)
end
def _prefix
end
def render(template = action_name)
self.response_body = render_to_string(template)
def render(name = action_name, options = {})
self.response_body = render_to_string(name, options)
end
def render_to_string(template = action_name, prefix = true)
tmp = view_paths.find_by_parts(template.to_s, formats, (_prefix if prefix))
_render_template(tmp)
# Raw rendering of a template.
# ====
# @option _prefix<String> The template's path prefix
# @option _layout<String> The relative path to the layout template to use
#
# :api: plugin
def render_to_string(name = action_name, options = {})
template = view_paths.find_by_parts(name.to_s, formats, options[:_prefix])
_render_template(template, options)
end
def _render_template(tmp)
_action_view._render_template_with_layout(tmp)
def _render_template(template, options)
_action_view._render_template_with_layout(template)
end
def view_paths() _view_paths end
module ClassMethods
def append_view_path(path)
self.view_paths << path
end
def view_paths
self._view_paths
end
def view_paths=(paths)
self._view_paths = paths.is_a?(ActionView::PathSet) ?
paths : ActionView::Base.process_view_paths(paths)
end
end
end
end
\ No newline at end of file
module ActionController
autoload :AbstractBase, "action_controller/new_base/base"
autoload :HideActions, "action_controller/new_base/hide_actions"
autoload :Layouts, "action_controller/new_base/layouts"
autoload :Renderer, "action_controller/new_base/renderer"
autoload :UrlFor, "action_controller/new_base/url_for"
end
\ No newline at end of file
module ActionController
module Layouts
def render_to_string(options)
options[:_layout] = options[:layout] || _layout
super
end
def _layout
begin
view_paths.find_by_parts(controller_path, formats, "layouts")
rescue ActionView::MissingTemplate
begin
view_paths.find_by_parts("application", formats, "layouts")
rescue ActionView::MissingTemplate
end
end
end
end
end
\ No newline at end of file
......@@ -11,6 +11,11 @@ module Renderer
# end
# end
def initialize(*)
self.formats = [:html]
super
end
def render(action, options = {})
# TODO: Move this into #render_to_string
if action.is_a?(Hash)
......@@ -23,22 +28,21 @@ def render(action, options = {})
self.response_body = render_to_string(options)
end
def render_to_string(options)
self.formats = [:html]
def render_to_string(options)
unless options.is_a?(Hash)
options = {:action => options}
end
if options.key?(:text)
_render_text(options)
elsif options.key?(:template)
template = options.delete(:template)
super(template, false)
super(template)
elsif options.key?(:action)
template = options.delete(:action).to_s
super(template)
options[:_prefix] = _prefix
super(template, options)
end
end
......
......@@ -28,7 +28,14 @@ class TestBasic < ActiveSupport::TestCase
# ====
class RenderingController < AbstractController::Base
include Renderer
def _prefix() end
def render(name = action_name, options = {})
options[:_prefix] = _prefix
super
end
append_view_path File.expand_path(File.join(File.dirname(__FILE__), "views"))
end
......@@ -121,7 +128,12 @@ def self.layout(formats)
def _layout
self.class.layout(formats)
end
end
def render_to_string(name = action_name, options = {})
options[:_layout] = options[:layout] || _layout
super
end
end
class Me4 < WithLayouts
......
......@@ -2,6 +2,7 @@
module HappyPath
# This has no layout and it works
class RenderActionController < ActionController::Base2
def render_action_hello_world
......@@ -71,5 +72,27 @@ class TestRenderActionWithSymbol < SimpleRouteCase
assert_body "Hello world!"
assert_status 200
end
# # ==== Render actions with layouts ====
class RenderActionWithLayoutController < ActionController::Base2
# Set the view path to an application view structure with layouts
self.view_paths = [File.join(File.dirname(__FILE__), 'views', 'with_layout')]
def hello_world
render :action => "hello_world"
end
end
class TestRenderActionWithLayout < SimpleRouteCase
describe %(
Render hello_world and implicitly use application.html.erb as a layout if
no layout is specified and no controller layout is present
)
get "/happy_path/render_action_with_layout/hello_world"
assert_body "OHAI Hello World! KTHXBAI"
assert_status 200
end
end
\ No newline at end of file
......@@ -33,6 +33,7 @@ class Base2 < AbstractBase
include ActionController::HideActions
include ActionController::UrlFor
include ActionController::Renderer
include ActionController::Layouts
def self.inherited(klass)
@subclasses ||= []
......
OHAI <%= yield %> KTHXBAI
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册