如何在 rails 中异步执行 Controller.destroy 操作?

How to perform Controller.destroy action asynchronously in rails?

我可以通过以下代码轻松删除 rails 应用程序中 post synchronously 的条目:

观看次数

<% @post.each do |post| %>
 <tr>
   <td colspan="3"><%= link_to 'Destroy', post, :method => :delete, :confirm => 'Are you sure?', :class => 'btn btn-mini btn-danger' %></td>
 </tr>
<% end %>

控制器class

def destroy
 @post = Post.find(params[:id])
 @post.destroy
 respond_to do |format|
   format.html redirect_to(posts_url) }
   format.xml  { head :ok }
 end
end

这很好用。如何使这个 destroy 过程 async。所以,我不需要添加 routerefresh the page

编辑

添加更多说明

任务是制作destroy方法async。这样客户端就不会等待响应,destroy 方法将在后台 运行 async。 destroy 方法也没有保证完成时间。

另一个例子可能是:我必须一次删除多个 post。

尝试 remote: true 选项,

<%= link_to 'Destroy', post, :method => :delete, remote: true, :confirm => 'Are you sure?', :class => 'btn btn-mini btn-danger' %>

def destroy
  @post = Post.find(params[:id])
  @post.destroy

  # Just Guessing you have @posts to refresh and `posts_template` using it.
  @posts = Post.all 

  respond_to do |format|
    format.html redirect_to(posts_url) }
    format.xml  { head :ok }
    format.js { render 'posts.js.erb' }
  end
end

posts.js.erb

$('some_element').replaceWith('<%=j render 'posts_template' %>');

请根据需要进行更改。我只是猜测。

要发出 Async 请求,您需要 Ajax 和基本 javascript 才能删除 <td> 的代码。

首先将您的 views 代码更改为:

<% @post.each do |post| %>
<tr>
  <td colspan="3"><%= link_to 'Destroy', post, :method=> :delete, id: post.id, :class => 'btn btn-mini btn-danger', data: { confirm: 'Are you Sure?', remote: true } %> </td>
</tr>
<% end %>

上面的代码说它将调用PostControllerclass的destroy方法。现在您需要对 controller class

destroy 方法进行一些更改
def destroy
 @post = Post.find(params[:id])
 @post.destroy
 respond_to do |format|
   format.js 
   format.html { redirect_to(posts_url) }
 end
end

上面的代码很好理解,除了我们为什么使用respond_to。在 rails 中,我们可以通过两种方式呈现数据:

  1. Javascript

  2. HTML

我们将使用 javascript 来呈现代码,因为这是在 ID.

的帮助下删除 <td> 标签的简单方法

现在我们需要一个 js 文件来呈现 destroy 方法的响应。为此,请将 destroy.js.erb 添加到 views.

的同一文件夹中

destroy.js.erb 中添加以下代码:

 var element = document.getElementById("<%= @post.id %>");
 element.parentNode.parentNode.remove();

大功告成! 我会推荐你​​阅读:http://www.gotealeaf.com/blog/the-detailed-guide-on-how-ajax-works-with-ruby-on-rails