如何让引导组件在使用rails的ajax之后打开?

Posted

技术标签:

【中文标题】如何让引导组件在使用rails的ajax之后打开?【英文标题】:how to let bootstrap component open after ajax with rails? 【发布时间】:2021-04-14 22:33:22 【问题描述】:

我正在使用 Bootstrap Collapse Component,在 collaspe 内部,有一个表单可以添加或删除 Todo 的 Comment

我使用remote: true 来获取ajax。问题是当我提交添加或删除操作时,它会在重新渲染时关闭折叠,请问如何解决?

这是我的表格

<ul>
  <% todo.comments.each do |comment| %>
    <li>
      <%= comment.content %>
      <%= link_to 'delete', comment_path(comment), method: :delete, data:  confirm: "Are you sure?" , remote: true %>
    </li>
  <% end %>
</ul>

这是我的控制器

  def create
    @comment = Comment.new(comment_params)
    authorize  @comment
    @todo = Todo.find(params[:todo_id])
    @comment.todo = @todo
    @comment.save
    redirect_to root_path
  end

  def destroy
    @comment = Comment.find(params[:id])
    authorize @comment
    @comment.destroy
    redirect_to root_path
  end

感谢您的帮助

【问题讨论】:

【参考方案1】:

在您的控制器中的销毁方法中,您有redirect_to root_path。因此,如果您将 remote: true 添加到您的 link_to 中,它将作为 AJAX 请求发送,但您的控制器会进行重定向。重定向将加载一个新页面,这就是它关闭折叠的原因。

要获得您不希望的结果,您不应进行重定向,而应重新渲染视图的一小部分。为此,您需要从控制器中删除 redirect_to root_path。在您的 views/cmets 文件夹中创建一个 destroy.js.erb 文件,您可以在其中重新渲染视图的一部分。一个小例子:

$("#id_of_html_element").html("<%= escape_javascript(render partial: 'name_of_the_partial_you_want_to_rerender') %>");

现在,当您单击删除链接时,它将转到控制器,删除评论,然后渲染 destroy.js.erb。 该文件将查找具有特定 id 的 html 元素并在其中呈现部分内容。所以不会有页面的硬重新加载,折叠将保持打开状态。 (除非您重新渲染折叠。在这种情况下,您需要调用 .collapse() )

【讨论】:

以上是关于如何让引导组件在使用rails的ajax之后打开?的主要内容,如果未能解决你的问题,请参考以下文章

在 AJAX 更新 Ruby on Rails 6 后,语义 UI 模式不会重新打开

Rails 可以让 Ajax 保持开放多久

Bootstrap隐藏模式在使用ajax的Rails 6中不起作用

如何在 iframe 中打开 ajax 成功的引导模式

如何在ajax成功中打开引导模式

如何让引导选项卡链接链接到 ruby​​ on rails 中的另一个部分文件以显示内容?