Skip to content

Commit

Permalink
Document+test that frame layout can be overridden
Browse files Browse the repository at this point in the history
  • Loading branch information
kevinmcconnell committed Feb 7, 2023
1 parent 5abe3c7 commit c975ede
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 5 deletions.
13 changes: 8 additions & 5 deletions app/controllers/turbo/frames/frame_request.rb
Original file line number Diff line number Diff line change
@@ -1,18 +1,21 @@
# Turbo frame requests are requests made from within a turbo frame with the intention of replacing the content of just
# that frame, not the whole page. They are automatically tagged as such by the Turbo Frame JavaScript, which adds a
# <tt>Turbo-Frame</tt> header to the request.
#
#
# When that header is detected by the controller, we substitute our own minimal layout in place of the
# application-supplied layout (since we're only working on an in-page frame, thus can skip the weight of the layout). We
# use a minimal layout, rather than avoid the layout entirely, so that it's still possible to render content into the
# <tt>head<tt>.
#
#
# Accordingly, we ensure that the etag for the page is changed, such that a cache for a minimal-layout request isn't
# served on a normal request and vice versa.
#
#
# This is merely a rendering optimization. Everything would still work just fine if we rendered everything including the
# full layout. Turbo Frames knows how to fish out the relevant frame regardless.
#
# full layout. Turbo Frames knows how to fish out the relevant frame regardless.
#
# The layout used is <tt>turbo_rails/frame.html.erb</tt>. If there's a need to customize this layout, an application can
# supply its own (such as <tt>app/views/layouts/turbo_rails/frame.html.erb</tt>) which will be used instead.
#
# This module is automatically included in <tt>ActionController::Base</tt>.
module Turbo::Frames::FrameRequest
extend ActiveSupport::Concern
Expand Down
18 changes: 18 additions & 0 deletions test/frames/frame_request_controller_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,15 @@ class Turbo::FrameRequestControllerTest < ActionDispatch::IntegrationTest
assert_select "meta[name=test][content=present]"
end

test "frame request layout can be overridden" do
with_prepended_view_path "test/frames/views" do
get tray_path(id: 1), headers: { "Turbo-Frame" => "true" }
end

assert_select "meta[name=test][content=present]"
assert_select "meta[name=alternative][content=present]"
end

test "frame requests get a unique etag" do
get tray_path(id: 1)
etag_without_frame = @response.headers["ETag"]
Expand All @@ -35,4 +44,13 @@ class Turbo::FrameRequestControllerTest < ActionDispatch::IntegrationTest
get tray_path(id: 1), headers: { "Turbo-Frame" => turbo_frame_request_id }
assert_match /#{turbo_frame_request_id}/, @response.body
end

private
def with_prepended_view_path(path, &block)
previous_view_paths = ApplicationController.view_paths
ApplicationController.prepend_view_path path
yield
ensure
ApplicationController.view_paths = previous_view_paths
end
end
9 changes: 9 additions & 0 deletions test/frames/views/layouts/turbo_rails/frame.html.erb
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<html>
<head>
<meta name="alternative" content="present" />
<%= yield :head %>
</head>
<body>
<%= yield %>
</body>
</html>

0 comments on commit c975ede

Please sign in to comment.