Hotwire turbo 流返回头:no_content
Hotwire turbo streams returning head :no_content
我有一个包含 posts 和评论的系统,每个 Post
has_many
Comment
s。我正在尝试设置一个 turbostream,这样当您 post 发表评论时它会立即显示。
一切正常,因为数据已保存到数据库中,但似乎 Turbo 流未正确返回。当我点击“评论”按钮时,没有任何变化,我收到 CommentsController#create
的 :no_content
消息
↳ 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 似乎可以在数据库中创建评论,并发回我可以在浏览器网络选项卡中看到的评论 POST 请求。我想知道为什么有 :no_content
以及为什么直到页面刷新才显示评论。
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
在 post 上,我将评论渲染为部分内容:
<div class="post__comments--inner">
<%= render '/comments/show', post: post %>
</div>
然后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 %>
我想我可能已经找到了问题,但我不确定为什么会这样,日志中的最后想法是:
Turbo::StreamsChannel transmitting "<turbo-stream action=\"replace\" target=\"comment_36\"><template> <div class=\"comment\" id=\"comment_36\">\n <div class=\"comment__user\">\n
在我看来应该是 action=\"append\"
而不是替换,特别是因为 comment_36
目前还不存在于页面上。
尝试按照文档中的示例操作:
respond_to do |format|
format.turbo_stream do
render turbo_stream: turbo_stream.append(:comments, partial: "comments/comment",
locals: { comment: @comment })
end
end
这应该将其附加到您的 html 中的 div 中,并带有评论 ID。
我有一个包含 posts 和评论的系统,每个 Post
has_many
Comment
s。我正在尝试设置一个 turbostream,这样当您 post 发表评论时它会立即显示。
一切正常,因为数据已保存到数据库中,但似乎 Turbo 流未正确返回。当我点击“评论”按钮时,没有任何变化,我收到 CommentsController#create
:no_content
消息
↳ 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 似乎可以在数据库中创建评论,并发回我可以在浏览器网络选项卡中看到的评论 POST 请求。我想知道为什么有 :no_content
以及为什么直到页面刷新才显示评论。
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
在 post 上,我将评论渲染为部分内容:
<div class="post__comments--inner">
<%= render '/comments/show', post: post %>
</div>
然后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 %>
我想我可能已经找到了问题,但我不确定为什么会这样,日志中的最后想法是:
Turbo::StreamsChannel transmitting "<turbo-stream action=\"replace\" target=\"comment_36\"><template> <div class=\"comment\" id=\"comment_36\">\n <div class=\"comment__user\">\n
在我看来应该是 action=\"append\"
而不是替换,特别是因为 comment_36
目前还不存在于页面上。
尝试按照文档中的示例操作:
respond_to do |format|
format.turbo_stream do
render turbo_stream: turbo_stream.append(:comments, partial: "comments/comment",
locals: { comment: @comment })
end
end
这应该将其附加到您的 html 中的 div 中,并带有评论 ID。