class Comment < ApplicationRecord
belongs_to :post
belongs_to :author, class_name: 'Member'
after_create_commit -> { broadcast_prepend_later_to(post, target: dom_id(post, :comments)) }
end
<%# private stream: turbo signs the serialized record name %>
<%= turbo_stream_from current_user %>
<section class="notifications">
<h1>Notifications</h1>
<%= form_with url: issues_path, method: :get, data: { turbo_frame: 'issue_results' } do |f| %>
<%= f.select :status, options_for_select(%w[open closed], params[:status]), include_blank: 'Any' %>
<%= f.submit 'Apply', class: 'ml-2 rounded bg-gray-100 px-3 py-1' %>
<% end %>
<%= turbo_frame_tag 'issue_results' do %>
<div data-controller="disclosure">
<button type="button" data-action="disclosure#toggle" aria-expanded="false" class="font-medium">
Advanced
</button>
<div data-disclosure-target="panel" class="mt-2 hidden">
<%= render 'advanced_filters' %>
<%= link_to project.name, project_path(project), data: { turbo_preload: true }, class: 'font-medium hover:underline' %>
<div class="layout">
<ul class="product-list">
<% @products.each do |product| %>
<li class="product-row">
<%= link_to product.name,
product_path(product),
class CommentsController < ApplicationController
def create
@post = Post.find(params[:post_id])
@comment = @post.comments.build(comment_params.merge(author: current_member))
if @comment.save
<%= turbo_frame_tag dom_id(user) do %>
<tr>
<td><%= user.name %></td>
<td><%= user.role %></td>
<td>
<%= link_to 'Edit', edit_user_path(user), data: { turbo_frame: dom_id(user) } %>
<div data-controller="toast" data-toast-timeout-value="2500" class="rounded bg-gray-900 px-3 py-2 text-white">
<div class="flex items-start justify-between gap-3">
<div><%= message %></div>
<button type="button" data-action="toast#close">✕</button>
</div>
</div>
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["bar", "percent", "status"]
static values = {
current: { type: Number, default: 0 },
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["menu", "overlay", "toggle"]
toggle() {
<%= turbo_stream.remove dom_id(@task) %>
<%= turbo_stream.append 'toasts' do %>
<%= render 'shared/toast' do %>
Deleted. <%= link_to 'Undo', restore_task_path(@task), data: { turbo_method: :post }, class: 'underline' %>
<% end %>