module Turbo::StreamsHelper # Returns a new Turbo::Streams::TagBuilder object that accepts stream actions and renders them them as # the template tags needed to send across the wire. This object is automatically yielded to turbo_stream.erb templates. # # When responding to HTTP requests, controllers can declare `turbo_stream` format response templates in that same # style as `html` and `json` response formats. For example, consider a `MessagesController` that responds to both # `text/html` and `text/vnd.turbo-stream.html` requests along with a `.turbo_stream.erb` action template: # # def create # @message = Message.create!(params.require(:message).permit(:content)) # respond_to do |format| # format.turbo_stream # format.html { redirect_to messages_url } # end # end # # <%# app/views/messages/create.turbo_stream.erb %> # <%= turbo_stream.append "messages", @message %> # # <%= turbo_stream.replace "new_message" do %> # <%= render partial: "new_message", locals: { room: @room } %> # <% end %> # # When a `app/views/messages/create.turbo_stream.erb` template exists, the # `MessagesController#create` will respond to `text/vnd.turbo-stream.html` # requests by rendering the `messages/create.turbo_stream.erb` view template and transmitting the response def turbo_stream Turbo::Streams::TagBuilder.new(self) end # Used in the view to create a subscription to a stream identified by the streamables running over the # Turbo::StreamsChannel. The stream name being generated is safe to embed in the HTML sent to a user without # fear of tampering, as it is signed using Turbo.signed_stream_verifier. Example: # # # app/views/entries/index.html.erb # <%= turbo_stream_from Current.account, :entries %> #
New entries will be appended to this target
# # The example above will process all turbo streams sent to a stream name like account:5:entries # (when Current.account.id = 5). Updates to this stream can be sent like # entry.broadcast_append_to entry.account, :entries, target: "entries". def turbo_stream_from(*streamables) tag.turbo_cable_stream_source channel: "Turbo::StreamsChannel", "signed-stream-name": Turbo::StreamsChannel.signed_stream_name(streamables) end end