diff options
| author | erdgeist <erdgeist@erdgeist.org> | 2026-07-06 06:09:21 +0200 |
|---|---|---|
| committer | erdgeist <erdgeist@erdgeist.org> | 2026-07-06 06:09:21 +0200 |
| commit | 9e63a6bec1b4ccc45dd684f7b6a941b75f9b9cf0 (patch) | |
| tree | 8c7842b3703ad2224deace37f9bd48df3374349b /app/controllers/nodes_controller.rb | |
| parent | b547decd1f85b43d5fb9e86cd7462b455059b1d1 (diff) | |
Add public preview links for drafts
Lets editors share a draft with people outside the admin system, via a
random per-page token rather than an enumerable id - /preview/<token>.
shared_previews#show is intentionally unauthenticated. Redirects to the
real public URL once the page is published. Surfaced on nodes#show
(Admin Preview + Public Preview, next to Public Link) as generate/revoke
buttons.
Diffstat (limited to 'app/controllers/nodes_controller.rb')
| -rw-r--r-- | app/controllers/nodes_controller.rb | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/app/controllers/nodes_controller.rb b/app/controllers/nodes_controller.rb index 380a659..69aa268 100644 --- a/app/controllers/nodes_controller.rb +++ b/app/controllers/nodes_controller.rb | |||
| @@ -104,6 +104,24 @@ class NodesController < ApplicationController | |||
| 104 | redirect_to node_path(@node) | 104 | redirect_to node_path(@node) |
| 105 | end | 105 | end |
| 106 | 106 | ||
| 107 | def generate_shared_preview | ||
| 108 | @node = Node.find(params[:id]) | ||
| 109 | if @node.draft | ||
| 110 | @node.draft.ensure_preview_token! | ||
| 111 | flash[:notice] = "Shareable preview link created - see below." | ||
| 112 | else | ||
| 113 | flash[:notice] = "Create or edit a draft first - shared preview links are only available for pages with an active draft." | ||
| 114 | end | ||
| 115 | redirect_to node_path(@node) | ||
| 116 | end | ||
| 117 | |||
| 118 | def revoke_shared_preview | ||
| 119 | @node = Node.find(params[:id]) | ||
| 120 | @node.draft.revoke_preview_token! if @node.draft | ||
| 121 | flash[:notice] = "Shareable preview link revoked." | ||
| 122 | redirect_to node_path(@node) | ||
| 123 | end | ||
| 124 | |||
| 107 | def parameterize_preview | 125 | def parameterize_preview |
| 108 | render plain: slug_for(params[:title]) | 126 | render plain: slug_for(params[:title]) |
| 109 | end | 127 | end |
