Saya memiliki sistem dengan posting dan komentar, masing-masing Post has_many Comment. Saya mencoba mengatur turbostream sehingga ketika Anda memposting komentar, itu segera ditampilkan.

Semuanya berfungsi dalam data itu disimpan ke database tetapi sepertinya aliran turbo tidak kembali dengan benar. Ketika saya menekan tombol "komentar" tidak ada yang berubah dan saya mendapatkan pesan :no_content untuk CommentsController#create

  ↳ app/controllers/comments_controller.rb:11:in `create'
[ActiveJob] Enqueued Turbo::Streams::ActionBroadcastJob (Job ID: b0be3a08-d7bb-4216-aac5-2f274a22dcbf) to Async(default) with arguments: "Z2lkOi8vY2lhby9Qb3N0LzM", {:action=>:append, :target=>"comments", :locals=>{:comment=>#<GlobalID:0x00007fa94123baf8 @uri=#<URI::GID gid://ciao/Comment/16>>}, :partial=>"comments/comment"}
[ActiveJob] Enqueued Turbo::Streams::ActionBroadcastJob (Job ID: 382e45b4-7a8f-4c8c-9e48-819fab0c19c4) to Async(default) with arguments: "Z2lkOi8vY2lhby9Qb3N0LzM", {:action=>:replace, :target=>#<GlobalID:0x00007fa9401ea938 @uri=#<URI::GID gid://ciao/Comment/16>>, :locals=>{:comment=>#<GlobalID:0x00007fa9401ea0f0 @uri=#<URI::GID gid://ciao/Comment/16>>}, :partial=>"comments/comment"}
No template found for CommentsController#create, rendering head :no_content
Completed 204 No Content in 37ms (ActiveRecord: 8.5ms | Allocations: 8931)

Turbo tampaknya berfungsi sejauh membuat komentar di database, dan mengirim kembali permintaan POST komentar yang dapat saya lihat di tab jaringan browser. Saya bertanya-tanya mengapa ada :no_content dan mengapa komentar tidak ditampilkan sampai halaman disegarkan.

Place.rb

class Post < ApplicationRecord
  belongs_to :place
  has_many :comments
  broadcasts
end

Comment.rb

class Comment < ApplicationRecord
  belongs_to :post
  broadcasts_to :post
end

comment_controller.rb

def new
    @comment = @post.comments.new
  end

  def create
    @comment = current_user.comments.create!(comment_params)
    respond_to do |format|
      if @comment.save
         format.turbo_stream do
             render turbo_stream: turbo_stream.append(@comment, partial: 'comments/comment', locals: { comment: @comment })
        end
        format.html { redirect_to @comment.post.place }
      end
    end
  end

Di pos saya membuat komentar sebagai sebagian:

 <div class="post__comments--inner">
   <%= render '/comments/show', post: post %>
 </div>

Kemudian comments/_show.html.erb

  <%= turbo_stream_from post %>
  <%= render post.comments %>
  <% puts post.comments %>
  <div class="comments__post">
    <%= turbo_frame_tag "new_comment", src:  new_post_comment_path(post), target: "_top" %>
  </div>

_comment.html.erb

<div class="comment" id="<%= dom_id comment %>">
  <%= comment.content %>
</div>

new.html.erb

<%= turbo_frame_tag "new_comment", target: "_top" do %>
  <%= form_with model: [@comment.post, @comment], class: "comment-row__form",
     data: { controller: "reset_form", action: "turbo:submit-end->reset_form#reset" }  do |form| %>
      <%= form.text_area :content, class: "comment-form--input form-control", data: {target: "comments.body"} %>
      <%= form.hidden_field :post_id, value: @comment.post.id %>
      <%= form.submit "comment", class: "btn btn-primary mt-2 mt-sm-0 ml-sm-3" %>
 
  <% end %>
<% end %>

Saya pikir saya mungkin telah menemukan masalah tetapi saya tidak yakin mengapa itu terjadi, pemikiran terakhir di log adalah:

Turbo::StreamsChannel transmitting "<turbo-stream action=\"replace\" target=\"comment_36\"><template>  <div class=\"comment\" id=\"comment_36\">\n    <div class=\"comment__user\">\n

Menurut saya itu akan menjadi action=\"append\" daripada mengganti, terutama karena comment_36 saat ini belum ada di halaman.

0
tfantina 1 Mei 2021, 16:58

1 menjawab

Jawaban Terbaik

Coba ikuti contoh ini dari dokumen:

 respond_to do |format|
  format.turbo_stream do
    render turbo_stream: turbo_stream.append(:comments, partial: "comments/comment",
      locals: { comment: @comment })
  end
 end

Ini harus menambahkannya ke div di html Anda dengan id komentar.

1
Joel_Blum 1 Mei 2021, 21:10