Get very basic layouts working.
* Required small architecture change
This commit is contained in:
parent
8ab37c7660
commit
890321e51e
@ -1,10 +1,7 @@
|
||||
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
|
@ -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
|
||||
|
||||
def render(name = action_name, options = {})
|
||||
self.response_body = render_to_string(name, options)
|
||||
end
|
||||
|
||||
def render(template = action_name)
|
||||
self.response_body = render_to_string(template)
|
||||
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
|
@ -1,6 +1,7 @@
|
||||
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
|
19
actionpack/lib/action_controller/new_base/layouts.rb
Normal file
19
actionpack/lib/action_controller/new_base/layouts.rb
Normal file
@ -0,0 +1,19 @@
|
||||
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
|
@ -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
|
@ -33,6 +33,7 @@ class Base2 < AbstractBase
|
||||
include ActionController::HideActions
|
||||
include ActionController::UrlFor
|
||||
include ActionController::Renderer
|
||||
include ActionController::Layouts
|
||||
|
||||
def self.inherited(klass)
|
||||
@subclasses ||= []
|
||||
|
1
actionpack/test/new_base/views/with_layout/happy_path/render_action_with_layout/hello_world.html.erb
Normal file
1
actionpack/test/new_base/views/with_layout/happy_path/render_action_with_layout/hello_world.html.erb
Normal file
@ -0,0 +1 @@
|
||||
Hello World!
|
@ -0,0 +1 @@
|
||||
OHAI <%= yield %> KTHXBAI
|
Loading…
Reference in New Issue
Block a user