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

时间:2015-06-30 04:46:44

标签: ruby-on-rails ruby ruby-on-rails-4 controller

我可以通过以下代码轻松删除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 %>

控制器类

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方法也没有保证完成时间。

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

2 个答案:

答案 0 :(得分:2)

尝试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' %>');

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

答案 1 :(得分:0)

要发出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 %>

上面的代码说它会调用destroy类的PostController方法。现在,您需要在destroy

controller方法中进行一些更改
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

  3. 我们将使用javascript呈现代码,因为这是在<td>的帮助下删除ID标记的简便方法。

    现在我们需要一个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