# 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 }) %>