代码片段:
application.html.erb
<%= turbo_stream_from current_user, "counter" %>
<% if current_user%>
<%= render partial: "users/counter", locals: { user: current_user } %>
<% end %>users/_counter.html.erb
<%= turbo_frame_tag "#{dom_id user}_counter" do %>
<span class="text-subtitle">counter:<%= user.counter %></span>
<% end %>user.rb
include ActionView::RecordIdentifier
after_update_commit -> { broadcast_replace_to [self, "counter"],
partial: "users/counter",
locals: { user: self },
target: "#{dom_id(self)}_counter"
}第一次加载或刷新页面时,它将显示正确的计数器值。相关HTML:
<turbo-frame id="user_1_counter">
<span class="text-subtitle">counter:19</span>
</turbo-frame>通过控制台更新计数器:
irb(main):030:0> user.counter = 20
=> 20
user.save!
TRANSACTION (0.0ms) begin transaction
USELECT 1 AS one FROM "users" WHERE "users"."username" = ? AND "users"."id" != ? LIMIT ? [["username", "test 4"], ["id", 1], ["LIMIT", 1]]
User Update (0.6ms) UPDATE "users" SET "updated_at" = ?, "counter" = ? WHERE "users"."id" = ? [["updated_at", "2022-07-26 21:38:47.033843"], ["counter", 20], ["id", 1]]
TRANSACTION (0.4ms) commit transaction
Rendered users/_counter.html.erb (Duration: 0.0ms | Allocations: 8)
[ActionCable] Broadcasting to Z2lkOi8vY2x1Y2tjbHVjay9Vc2VyLzE:counter: "<turbo-stream action=\"replace\" target=\"user_1_counter\"><template><span class=\"text-subtitle\">counter:20</span></template></turbo-stream>"
=> true在播放此更改后,屏幕上的HTML将显示新的计数器值,但turbo-frame标记已消失:
<span class="text-subtitle">counter:20</span>如果我在控制台中再次更改计数器,即使广播被发送,网页上也不会有任何变化。这是有意义的,因为没有匹配目标ID的元素。
我的问题是,为什么在第一次更新之后没有呈现<turbo-frame>?
发布于 2022-07-26 23:51:11
使用常规HTML元素上的目标ID而不使用turbo-frame标记似乎解决了这个问题。
新_counter.html.erb
<span class="text-subtitle" id="<%= "#{dom_id user}_counter" %>"><%= user.counter %></span>https://stackoverflow.com/questions/73130098
复制相似问题