ruby-on-rails Rails:Turbo Frame / Turbo Stream元素在我第二次触发时不会呈现

7lrncoxx  于 2023-11-20  发布在  Ruby
关注(0)|答案(1)|浏览(156)

在显示类别列表的视图中,下面有一小部分显示这些类别的“默认值”。当用户点击那里时,它被一个下拉表单取代,他们可以在那里选择新的默认值。提交表单后,页面的两个部分-类别列表以及显示默认值的下部-将通过turbo流更新。
这一次成功了。如果我尝试第二次点击下面的元素,即使浏览器的网络选项卡显示有东西到达,整个页面还是一片空白。我不明白为什么会发生这种情况。
视图(索引页):

<%= turbo_frame_tag 'settings-content' do %>
  <h3 class="heading4">Available book formats</h3>
  <ul class="simple-list width-33" id="book-formats">
    <%= render 'new_form_entry' %>
    <%= turbo_frame_tag 'format-list' do %>
      <%= render @book_formats %>
    <% end %>
  </ul>
  <h3 class="heading4 margin-top-1 margin-bottom-50">Default Book Format</h3>
  <ul class="simple-list width-25">
    <li>
      <%= turbo_frame_tag 'default-format' do %>
        <%= render 'book_formats/set_default_form' %>
      <% end %>
    </li>
  </ul>
<% end %>

字符串
控制器(相关的两种方法):

def set_default
    @book_formats = BookFormat.all.order(:name)
  end

  def update_default
    @new_default = BookFormat.find_by(name: book_format_params[:name])
    @default_book_format.update(fallback: false)
    @new_default.update(fallback: true)
    @default_book_format = @new_default
    @book_formats = BookFormat.all.order(:name)
  end


update_default.turbo_stream.erb

<%= turbo_stream.replace 'format-list' do %>
      <%= render @book_formats %>
<% end %>
<%= turbo_stream.replace 'default-format' do %>
      <%= render 'book_formats/set_default_form' %>
<% end %>


我肯定在某个地方少了一小块。

r8uurelv

r8uurelv1#

turbo_frame_tag helper呈现一个 标签和表单:

<turbo-frame id="default-format">
  <form>
    <!-- ... -->
  </form>
</turbo-frame>

字符串
turbo_stream.replace替换目标 #default-format 为模板,在本例中,它只是格式:

<turbo-stream action="replace" target="default-format">
  <template>
    <form>
      <!-- ... -->
    </form>
  </template>
</turbo-stream>


这意味着 消失了:

<!-- target          identified by id -->
<!-- v               v                -->
    <turbo-frame id="default-format"></turbo-frame>

<!-- is replaced by -->
    <form></form>

<!-- end result -->
    <form></form>


流没有#default-format来第二次替换。
turbo_stream.update操作保留目标,只更新内容。

<!-- target          identified by id -->
<!-- v               v                -->
    <turbo-frame id="default-format"></turbo-frame>

<!-- target content is updated with -->
    <form></form>

<!-- end result -->
    <turbo-frame id="default-format">
      <form></form>
    </turbo-frame>

  • turbo-stream* 的目标可以是任何东西,而不仅仅是 turbo-frame
<!-- unless you're doing something else with this frame, 
     there is no need for it -->
<%= turbo_frame_tag "format-list" do %>
  <%= render @book_formats %>
<% end %>

<!-- just an `id` is enough for turbo-stream -->
<div id="format-list">
  <%= render @book_formats %>
</div>

相关问题