我可以通过以下代码轻松删除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
。因此,我不需要添加route
或refresh the page
。
添加更多解释
任务是制作destroy
方法async
。这样客户端就不会等待响应,destroy
方法将在后台async
中运行。 destroy方法也没有保证完成时间。
另一个例子可能是:我必须一次删除多个帖子。
答案 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
$('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中,我们可以通过两种方式呈现数据:
的Javascript
HTML
我们将使用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