如何从内存中检索与被破坏对象相关联的对象

时间:2017-07-18 11:36:01

标签: ruby-on-rails associations

我的应用程序有一个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_toformat.html不起作用,而不刷新页面。 如果有效,我可以在@micropost.comments.count == 1 remove links

中使用if 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])

1 个答案:

答案 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)