我的应用程序有一个Micropost模型和一个Comment模型。 我在Micropost部分链接中介绍了显示/隐藏和刷新注释的内容:
<li id="micropost-<%= micropost.id %>">
<span class="user"><%= link_to micropost.user.name, micropost.user %></span>
<span class="content">
<%= micropost.content %>
<%= image_tag micropost.picture.url if micropost.picture? %>
</span>
<% if micropost.comments.any? %>
~ <%= link_to "Show/hide comments", "#", class: "comments-link", remote: true %>
~ <%= link_to "Refresh comments", fetch_comments_path(micropost), remote: true %>
<% end %>
<% if logged_in? && (current_user == micropost.user || current_user.friend?(micropost.user)) %>
<div class="comment-section">
<%= form_for(current_user.comments.build, remote: true) do |f| %>
...
<% end %>
</div>
<% end %>
<div class="comments-section">
<% if micropost.comments.any? %>
<ol id="comments_micropost-<%= micropost.id %>">
<% micropost.comments.each do |comment| %>
<%= render comment %>
<% end %>
</ol>
<% end %>
</div>
</li>
创建第一条评论后,此链接会添加到页面中,如果微博有评论,则会加载。
但是,如果只有一个注释被删除,它们就没用了,所以我想通过注释控制器的destroy动作用Ajax删除它们。
我有麻烦意识到这一点。
主要问题是我不能使用待破坏的评论来引用微博。
一旦评论被销毁,任何@micropost = @comment.micropost
关联都将返回一个零对象:
def destroy
@comment = current_user.comments.find_by(id: params[:id])
@micropost = @comment.micropost
@comment.destroy
respond_to do |format|
format.html do
flash[:success] = "Comment deleted"
redirect_to request.referrer || root_url
end
format.js
end
end
因此,在create.js.erb
内,我无法使用if @micropost.comments.nil? remove links
条件
在@comment.destroy
阻止之后移动respond_to
对format.html
不起作用,而不刷新页面。
如果有效,我可以在@micropost.comments.count == 1 remove links
create.js.erb
条件
我无法在@comment.destroy
块内移动format.html
,因为format.js
不会使用它。
我可以使用什么解决方案?
评论部分中的删除链接是:
<%= link_to "delete", comment, method: :delete, remote: true %>
是否可以传递link_to
等于micropost.id
的参数值,例如:
<%= link_to "delete", comment, method: :delete, micropost_id: micropost.id, remote: true %>
这样我就可以写下毁灭动作:
@micropost = Micropost.find(params[:micropost_id])
?
答案 0 :(得分:2)
当您销毁对象时,它会从数据库中销毁,所有引用键都会立即销毁。所以你可以先获取帖子ID和删除评论。
def destroy
@micropost_id = @comment.micropost.id
@comment.destroy
end
现在,您可以使用@micropost_id
进行其他操作或重定向到父帖子,如下所示:
redirect_to '/microposts/'+ @micropost_id
或者
redirect_to MicroPost.find(micropost_id)