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