Pin without redirect

Use turbo stream response to save on the redirect latency
This commit is contained in:
David Heinemeier Hansson
2025-04-17 14:05:26 +02:00
parent 07e801b74c
commit fc0cf3917f
6 changed files with 18 additions and 19 deletions
-4
View File
@@ -6,16 +6,12 @@ class Cards::PinsController < ApplicationController
def create
pin = @card.pin_by Current.user
broadcast_my_new pin
redirect_to card_pin_path(@card)
end
def destroy
pin = @card.unpin_by Current.user
broadcast_my_removed pin
redirect_to card_pin_path(@card)
end
private
+11
View File
@@ -0,0 +1,11 @@
<div id="<%= dom_id(card, :pin_button) %>">
<% if card.pinned_by? Current.user %>
<%= button_to card_pin_path(card), method: :delete, class: "btn btn--reversed" do %>
<%= icon_tag "pinned" %> <span class="for-screen-reader">Un-pin this card</span>
<% end %>
<% else %>
<%= button_to card_pin_path(card), class: "btn" do %>
<%= icon_tag "unpinned" %> <span class="for-screen-reader">Pin this card</span>
<% end %>
<% end %>
</div>
@@ -0,0 +1 @@
<%= turbo_stream.replace [ @card, :pin_button ], partial: "cards/pins/pin", locals: { card: @card } %>
@@ -0,0 +1 @@
<%= turbo_stream.replace [ @card, :pin_button ], partial: "cards/pins/pin", locals: { card: @card } %>
+1 -11
View File
@@ -1,13 +1,3 @@
<%= turbo_frame_tag dom_id(@card, :pin) do %>
<% if @card.pinned_by? Current.user %>
<%= button_to card_pin_path(@card), method: :delete, class: "btn btn--reversed" do %>
<%= icon_tag "pinned" %>
<span class="for-screen-reader">Un-pin this card</span>
<% end %>
<% else %>
<%= button_to card_pin_path(@card), class: "btn" do %>
<%= icon_tag "unpinned" %>
<span class="for-screen-reader">Pin this card</span>
<% end %>
<% end %>
<%= render "cards/pins/pin", card: @card %>
<% end %>
@@ -9,23 +9,23 @@ class Cards::PinsControllerTest < ActionDispatch::IntegrationTest
assert_changes -> { cards(:layout).pinned_by?(users(:kevin)) }, from: false, to: true do
perform_enqueued_jobs do
assert_turbo_stream_broadcasts([ users(:kevin), :pins ], count: 1) do
post card_pin_path(cards(:layout))
post card_pin_path(cards(:layout)), as: :turbo_stream
end
end
end
assert_redirected_to card_pin_path(cards(:layout))
assert_response :success
end
test "destroy" do
assert_changes -> { cards(:shipping).pinned_by?(users(:kevin)) }, from: true, to: false do
perform_enqueued_jobs do
assert_turbo_stream_broadcasts([ users(:kevin), :pins ], count: 1) do
delete card_pin_path(cards(:shipping))
delete card_pin_path(cards(:shipping)), as: :turbo_stream
end
end
end
assert_redirected_to card_pin_path(cards(:shipping))
assert_response :success
end
end