# Terminal rails action_text:set up rails g scaffold posts title rails g mannequin remark submit:belongs_to session rails g controller feedback
# app/fashions/submit.rb class Put up < ApplicationRecord has_many :feedback, dependent: :destroy has_rich_text :content material has_one_attached :poster broadcasts_refreshes finish
# app/views/posts/_form.html.erb
<div class="mb-3">
<%= type.label :poster, class: 'form-label' %>
<%= type.file_field :poster, class: 'form-control' %>
</div>
<div class="mb-3">
<%= type.label :content material, class: 'form-label' %>
<%= type.rich_text_area :content material, class: 'form-control' %>
</div>
# app/controllers/posts_controller.rb def post_params params.require(:submit).allow(:title, :poster, :content material) finish
# app/views/posts/present.html.erb
<%= turbo_stream_from @submit %>
<%= render @submit %>
<h2>Feedback</h2>
<div id="feedback">
<%= render partial: "feedback/remark", assortment: @submit.feedback, locals: { submit: @submit } %>
</div>
<div data-turbo-permanent>
<%= render partial: "feedback/new", locals: { submit: @submit, remark: @submit.feedback.new } %>
</div>
# app/views/posts/_post.html.erb
<div id="<%= dom_id submit %>" class="scaffold_record position-relative">
<% if submit.poster.hooked up? %>
<%= image_tag submit.poster.variant(resize_to_fill: [1600, 300]), class: "img-fluid" %>
<% finish %>
<h1 class="position-absolute top-50 start-50 translate-middle text-white text-center">
<%= submit.title %>
</h1>
</div>
<%= submit.content material %>
# config/routes.rb sources :posts do sources :feedback, solely: [:create, :destroy] finish
# app/controllers/comments_controller.rb
class CommentsController < ApplicationController
before_action :set_post
def create
@remark = @submit.feedback.new(comment_params)
@remark.session = session.id
@remark.save
# redirect_to @submit
# render turbo_stream: [
# turbo_stream.replace(
# "new_comment",
# partial: "comments/new",
# locals: { post: @post, comment: Comment.new }
# ),
# turbo_stream.append(
# "comments",
# partial: "comments/comment",
# locals: { post: @post, comment: @comment }
# )
# ]
finish
def destroy
@remark = @submit.feedback.discover(params[:id])
@remark.destroy
redirect_to @submit
finish
non-public
def set_post
@submit = Put up.discover(params[:post_id])
finish
def comment_params
params.require(:remark).allow(:content material)
finish
finish
# app/views/feedback/_new.html.erb <%= form_with mannequin: [post, comment], id: :new_comment do |f| %> <%= f.rich_text_area :content material %> <%= f.submit class: "mt-3 btn btn-primary" %> <% finish %>
# app/views/feedback/_comment.html.erb
<%= content_tag :div, id: dom_id(remark), class: "card mb-3" do %>
<div class="card-body">
<p class="card-text"><%= remark.content material %></p>
<p class="card-text">
<small class="text-muted">
Posted <%= time_ago_in_words remark.created_at %> in the past |
Posted by <%= remark.session %>
<% if session.id.to_s == remark.session %>
<%= link_to "Delete", [post, comment], "data-turbo-method": :delete %>
<% finish %>
</small>
</p>
</div>
<% finish %>
# app/fashions/remark.rb class Remark < ApplicationRecord belongs_to :submit has_rich_text :content material # broadcasts_to :submit broadcasts_refreshes_to :submit finish
# Gemfile gem "turbo-rails", "2.0.0-beta.2"
# package deal.json "@hotwired/turbo-rails": "^8.0.0-beta.2",
# app/views/layouts/software.html.erb <%# turbo_refreshes_with technique: :substitute, scroll: :reset %> <%= turbo_refreshes_with technique: :morph, scroll: :protect %> <%= yield :head %>
# app/views/feedback/create.turbo_stream.erb
<%= turbo_stream.substitute(
"new_comment",
partial: "feedback/new",
locals: { submit: @submit, remark: Remark.new }) %>
<%= turbo_stream.append(
"feedback",
partial: "feedback/remark",
locals: { submit: @submit, remark: @remark }) %>

