diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-07-21 17:34:13 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-07-21 17:34:13 +0200 |
| commit | 65da515e27939c90a66ec3b063b5e58943d3dcea (patch) | |
| tree | 16ede71f65cc48444561dbde6c9c95368b564eb9 /app | |
| parent | cc4659a308590be083065f19df8571efc345052a (diff) | |
Resolve preview's page-to-node lookup for every layer
pages_controller#preview loaded a page by id and rendered it
directly, assuming @page.node was always present. True for head and
draft, since both carry a real node_id: false for autosave, which
deliberately has node_id: nil (the mechanism that excludes it from
Node#pages and the revision count). A node with an autosave and no
draft underneath it: lock, start editing, never explicitly save a
draft: loads that autosave directly with no node at all, and any
view code assuming @page.node is real (headline image, credits,
gallery links) raises.
When @page has no node, resolve it by checking autosave_id, then
draft_id, then head_id on Node, and set @page.node in memory only:
the autosave's node_id: nil is never persisted differently. The
existing swap from draft to a fresher autosave, when both exist, is
unchanged.
Three tests: draft with a fresher autosave on top, autosave with no
draft underneath, and the ordinary head-only case with neither.
Diffstat (limited to 'app')
| -rw-r--r-- | app/controllers/pages_controller.rb | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/app/controllers/pages_controller.rb b/app/controllers/pages_controller.rb index 0b7e98f..326fbd4 100644 --- a/app/controllers/pages_controller.rb +++ b/app/controllers/pages_controller.rb | |||
| @@ -6,6 +6,19 @@ class PagesController < ApplicationController | |||
| 6 | 6 | ||
| 7 | def preview | 7 | def preview |
| 8 | @page = Page.find(params[:id]) | 8 | @page = Page.find(params[:id]) |
| 9 | unless @page.node | ||
| 10 | node = Node.find_by(autosave_id: @page.id) || | ||
| 11 | Node.find_by(draft_id: @page.id) || | ||
| 12 | Node.find_by(head_id: @page.id) | ||
| 13 | @page.node = node if node | ||
| 14 | end | ||
| 15 | |||
| 16 | node ||= @page.node | ||
| 17 | if node && node.draft_id == @page.id && node.autosave | ||
| 18 | @page = node.autosave | ||
| 19 | @page.node = node | ||
| 20 | end | ||
| 21 | |||
| 9 | 22 | ||
| 10 | if @page | 23 | if @page |
| 11 | template = @page.valid_template | 24 | template = @page.valid_template |
