Vin*_*e W 5 turbolinks ruby-on-rails-6.1 hotwire-rails
我已经正确连接了 hotwire/turbo,以便对页面上某个位置的单个模型进行增删改查操作,但我也想同时在页面上的不同位置更新同一模型。我以为我可以设置两个流,但它似乎不起作用。
指定目标确实适用于创建操作,具体取决于我如何命名目标,但不适用于更新和销毁。这是我认为应该有效但无效的:
----位置 1(“生物”流)----
<div id="creatures">
<%= turbo_stream_from "creatures" %>
<%= turbo_frame_tag "creatures" do %>
<div>
<% @creatures.each do |creature| %>
<div>
<%= render "creatures/creature", creature: creature %>
</div>
<% end %>
</div>
<% end %>
</div>
Run Code Online (Sandbox Code Playgroud)
----位置 2(“creatures_main”流)----
<%= turbo_stream_from "creatures_main" %>
<%= turbo_frame_tag "creatures_main" do %>
<% @creatures.each do |creature| %>
<div>
<%= render "creatures/creature", creature: creature %>
</div>
<% end %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
---- 常见_creature.html.erb 部分 ----
<%= turbo_frame_tag dom_id(creature) do %>
<%= link_to creature.name, "#" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
---- 生物.rb ----
class Creature < ApplicationRecord
validates :name, presence: true
after_create_commit {
broadcast_append_to "creatures"
broadcast_append_to "creatures_main"
}
after_update_commit {
broadcast_replace_to "creatures"
broadcast_replace_to "creatures_main"
}
after_destroy_commit {
broadcast_remove_to "creatures"
broadcast_remove_to "creatures_main"
}
end
Run Code Online (Sandbox Code Playgroud)
当我的模型中有两个调用时,会发生什么情况:创建操作将新创建的生物两次放置在位置 1 中,两者中只有 1 个被更新,但无论它们位于页面上的哪个位置,它们都会被正确销毁。
creatures并且creatures_main将是流名称。您正在寻找的是target和partial来控制流将在何处更新您的数据,以及它将使用哪个部分来更新。
你可以试试:
after_create_commit -> {
# target here is the ID of the outer div, where data would be appended to
broadcast_append_to "creatures", target: "creatures"`
broadcast_append_to "creatures_main", target: "creatures_main"
}
after_update_commit {
# target here is the ID of each of the creature div
broadcast_replace_to "creatures", target: "creature_#{id}"
broadcast_replace_to "creatures_main", target: "creature_main_#{id}"
}
after_destroy_commit {
broadcast_remove_to "creatures"
broadcast_remove_to "creatures_main"
}
Run Code Online (Sandbox Code Playgroud)
<%= turbo_frame_tag "creature_#{creature.id}" do %>
<%= link_to creature.name, "#" %>
<% end %>
<%= turbo_frame_tag "creature_main_#{creature.id}" do %>
<%= link_to creature.name, "#" %>
<% end %>
Run Code Online (Sandbox Code Playgroud)
当然,这意味着如果您有turbo_frame_tag内部部分,您可能必须使用 2 个不同的部分。你可以这样做:
after_create_commit -> {
# target here is the ID of the outer div, where data would be appended to
broadcast_append_to "creatures", target: "creatures"`
broadcast_append_to "creatures_main", target: "creatures_main"
}
after_update_commit {
# target here is the ID of each of the creature div
broadcast_replace_to "creatures", target: "creature_#{id}"
broadcast_replace_to "creatures_main", target: "creature_main_#{id}"
}
after_destroy_commit {
broadcast_remove_to "creatures"
broadcast_remove_to "creatures_main"
}
Run Code Online (Sandbox Code Playgroud)
顺便说一句,您应该使用这些方法的_later 版本。还可以使用渲染集合以便于阅读。
| 归档时间: |
|
| 查看次数: |
3570 次 |
| 最近记录: |