# models/tueet.rb class Tueet < ApplicationRecord # Model broadcasts after_create_commit do broadcast_prepend_to :tueets, target: "tueets", partial: "tueets/tueet", locals: { tueet: self } end end
# controllers/tueets_controller.rb class TueetsController < ApplicationController before_action :authenticate_user!, except: %i[ show ] before_action :set_tueet, only: %i[ show destroy ] def new @tueet = current_user.tueets.new end def create @tueet = current_user.tueets.new(tueet_params) respond_to do |format| if @tueet.save format.turbo_stream { render turbo_stream: turbo_stream.replace( "new_tueet", partial: "tueets/form", locals: { tueet: Tueet.new } ) } end end end
# views/tueets/form.html.erb <%= turbo_frame_tag "new_tueet", target: :_top do %> <%= simple_form_for(tueet) do |f| %> <%= f.input :body, label: false, placeholder: 'News, moments, ideas...', input_html: { class: 'w-full h-11 px-3 py-2 border border-gray-200 rounded-full', style: 'resize: none;' } %> <%= f.submit 'Post', class: 'h-11 px-4 cursor-pointer font-sans font-bold text-md text-white bg-gradient-to-r from-green-400 to-blue-500 rounded-full' %> <% end %> <% end %>
<%= turbo_frame_tag "new_tueet", src: new_tueet_path %>
# views/feed/index.html.erb <%= turbo_stream_from :tueets %> <!-- Tueet form --> <div class="w-full h-max p-3"> <%= turbo_frame_tag "new_tueet", src: new_tueet_path %> </div> <!-- Twueets --> <div id="tueets"> <%= render @tueets %> </div>
<%= content_tag :div, id: dom_id(tueet), class: 'w-full h-max p-3 flex flex-row items-start justify-start border-t border-gray-100 gap-2' do %> <%= tueet.body %> <% end %>