2017-07-18 8 views
0

に関連するオブジェクトを盗んする方法私のアプリケーションはMicropostモデルとコメントモデルを有しています。 私は/隠し、さわやかなコメントを示すため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> 

このリンクは最初のコメントを作成し、micropostがコメントを持っている場合はロードされた後のページに追加されます。
はしかし、そこに一つだけのコメントがあり、それが削除された場合には、彼らは役に立たないので、私はコメントコントローラの破壊作用を介してのAjaxでそれらを削除したいと思います。
私はこれを実現するために私のトラブルを抱えています。
主な問題は、破棄されるコメントを使ってマイクロポストを参照することができないことです。 コメントが破壊されると任意の@micropost = @comment.micropost協会がnilオブジェクトを返すでしょう:respond_toブロックをリフレッシュすることなく、format.htmlのために動作しません後create.js.erbの内側に、私は@comment.destroyを移動if @micropost.comments.nil? remove links条件

を使用することはできません、したがって

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 

をページ。 それが働いた場合、それがformat.jsで使用されないので、私は、format.htmlブロック内@comment.destroyを移動することはできませんcreate.js.erb

の条件@micropost.comments.count == 1 remove links場合、私は使用することができます。 どのようなソリューションを使用できますか?

部分のコメントで削除リンクは次のとおりです。私は書くことができるように

<%= link_to "delete", comment, method: :delete, micropost_id: micropost.id, remote: true %> 

<%= link_to "delete", comment, method: :delete, remote: true %> 

はそれのような、link_tomicropost.idに等しいのparams値を渡すことができます破壊行為で:
@micropost = Micropost.find(params[:micropost_id])?あなたがオブジェクトを破棄するとき

答えて

2

それはフォームのデータベースを破壊され、すべての参照キーはすぐに破棄されます。あなたは最初に投稿IDとコメントを削除することができます。ではないであろう上記のようmicropost_id` @

redirect_to '/microposts/'+ @micropost_id 

それとも

redirect_to MicroPost.find(micropost_id) 
+0

':

def destroy @micropost_id = @comment.micropost.id @comment.destroy end 

今、あなたは別のアクションを取るか、このような親のポストにリダイレクトする@micropost_idを使用することができます'@ comment.micropost.id'として定義されているので、 '@ comment'を破棄した後に取り出すことができます。これはnilです。 – Asarluhi

+1

@micropost_idは、あなたのajaxコールセッションが残るまで残ります。 create.js.erbで使用できます。ページを更新した後は使用できません。あなたは問題を数語で説明することができます。あなたは達成するために何をしたいですか? –

+0

Micropost.find(@micropost_id).comments.anyが指定されていない限り、<%を使用したいと思いますか? %> 'create.js.erb内のリンクを削除する – Asarluhi

関連する問題