I had a situation whereby (taking the tutorial example) when the current user created a new message I wanted the appended message to render for them with edit / delete actions but not for other users.
The solution I went with was to use a turbo stream to target one div on the current users rendered page and broadcasts to target a different one. e.g.
<% if current_user %>
<%= turbo_frame_tag "new_message", src: new_room_message_path(@room), target: "_top" %>
<div id="current_user_messages">
<%= render @room.messages %>
</div>
<% else %>
<%= turbo_stream_from "messages" %>
<div id="messages">
<%= render @room.messages %>
</div>
<% end %>
# create.trubo_stream
<%= turbo_stream.prepend "current_user_messages" do %>
# so you can use current user logically when rendering template
<%= render partial: "message", locals: { message: @message current_user: current_user } %>
<% end %>
# message.rb
after_create_commit { broadcast_prepend_to 'messages' }
# messages_controller.rb
...
respond_to do |format|
format.turbo_stream
end
# _message.html.erb
<%= turbo_frame_tag dom_id(message do %>
....
<% if current_user %>
<div><%= link_to 'Edit'...></div>%>
<% end %>
<% end %>