2017-07-18 2 views
0

Mon application a un modèle Micropost et un modèle Comment. Je introduit dans les liens partiels Micropost pour commentaires Afficher/masquer et rafraîchissants:comment récupérer de la mémoire un objet associé à un objet détruit

<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> 

Ce sont des liens ajoutés à la page après la création du premier commentaire et sont chargés si le microtiges a des commentaires.
Cependant, dans le cas où il n'y a qu'un seul commentaire et qu'il est supprimé, ils sont inutiles donc je voudrais les supprimer avec Ajax via l'action destroy du contrôleur de commentaires.
J'ai des ennuis à réaliser.
Le problème principal est que je ne peux pas me référer au micropost en utilisant le commentaire à détruire. Une fois que le commentaire est détruit toute association @micropost = @comment.micropost retournerait un objet nul:

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 

Ainsi, à l'intérieur create.js.erb je ne peux pas utiliser une if @micropost.comments.nil? remove links conditionnelle

Déplacement @comment.destroy après le bloc respond_to ne fonctionnerait pas pour format.html, sans rafraîchir la page. Si cela a fonctionné, je pouvais utiliser un si @micropost.comments.count == 1 remove links conditionnel dans create.js.erb

Je ne peux pas bouger @comment.destroy l'intérieur du bloc format.html, car il ne serait pas utilisé par format.js. Quelle solution puis-je utiliser?

Le lien de suppression dans le commentaire partiel est:

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

Est-il possible de passer en link_to une valeur params égale à micropost.id, tels que:

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

pour que je puisse écrire dans l'action de destruction:
@micropost = Micropost.find(params[:micropost_id])?

Répondre

2

Lorsque vous détruisez votre objet, il est détruit dans la base de données et toutes les clés de référence sont immédiatement détruites. Ainsi, vous pouvez d'abord récupérer l'identifiant de publication et le commentaire de suppression.

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

Maintenant, vous pouvez utiliser @micropost_id pour prendre une autre action ou rediriger vers le poste parent comme celui-ci:

redirect_to '/microposts/'+ @micropost_id 

Ou

redirect_to MicroPost.find(micropost_id) 
+0

'@ micropost_id' tel que défini ci-dessus ne serait pas récupérable après avoir détruit '@ comment', car il est défini comme' @ comment.micropost.id' qui est nul. – Asarluhi

+1

@micropost_id reste jusqu'à ce que votre session d'appel ajax reste. Vous pouvez l'utiliser dans create.js.erb. Une fois que vous avez actualisé la page, vous ne pouvez plus l'utiliser. Vous pouvez expliquer votre problème en quelques mots. Qu'est-ce que vous voulez réaliser? –

+0

Je voudrais utiliser un <% sauf si Micropost.find (@micropost_id) .comments.any? %> 'supprimer des liens dans create.js.erb – Asarluhi