0
votes

Rails Delete ne détruit pas l'enregistrement, se rafraîchit simplement

Mon lien de destruction / suppression actualise simplement la page de publication et ne supprime pas réellement l'enregistrement.

 def destroy
    @post= Post.find(params[:id])

    @post.destroy

    redirect_to posts_path

  end

Contrôleur

<span class="delete-button"><%= link_to 'Delete', post_path(@post), method: :delete, data: { confirm: 'Are you sure?' } %>
</span>


2 commentaires

Pouvez-vous vous connecter et nous indiquer la sortie de @ post.errors.full_messages ? Assurez-vous de regarder les erreurs après que vous essayez de le détruire.


Je ne pense pas que la destruction soit appelée. Le journal n'enregistre pas une tentative de suppression


3 Réponses :


1
votes

Vous ne parvenez pas à vérifier si @ post.destroy réussit, il renvoie vrai ou faux.

La chose la plus simple à faire est d'utiliser @ post.destroy! qui lèvera une exception en cas d'échec . En général, utilisez le! versions pour vous assurer de ne manquer aucune erreur: create! , destroy! , save! et update! code >.

Je suppose que le @post a des objets associés qui font référence au message. Ceux-ci doivent être supprimés avant que la publication ne soit supprimée. Vous pouvez résoudre ce problème en ajoutant depend:: destroy à ses relations.

class Comment
  belongs_to :post
end

class Post
  has_many :comments, dependent: :destroy
end


1 commentaires

La publication a des modèles associés



1
votes

Si votre page est en cours d'actualisation et n'effectue pas de redirection par l'action du contrôleur, il est possible que la page n'ait pas rails-ujs . Sans cela, vous ne pouvez pas faire de requêtes non GET via des hyperliens, donc le lien irait simplement à la page show de la publication.

Si l'enregistrement échoue vraiment à être supprimé, cela pourrait être plusieurs raisons. Une façon de préciser pourquoi le message n'a pas pu être supprimé serait de sortir de l'exception que destroy! déclenche et enregistre ou affiche les erreurs du message:

<% flash.each do |_type, message| %>
  <div><%= message %></div>
<% end %>

Si vous n'avez pas configuré de messages flash pour votre vue, vous pouvez les placer dans votre fichier de vue:

def destroy
  post = Post.find(params[:id])
  post.destroy!

  redirect_to posts_path, notice: "Post deleted successfully"
rescue ActiveRecord::RecordNotDestroyed => e
  failure_message = "Post failed to delete: #{e.record.errors.full_messages}"

  Rails.logger.warn "==> #{failure_message}"
  redirect_to posts_path, alert: failure_message
end

Maintenant, si le message ne parvient pas à être supprimé, vous pouvez afficher un message flash expliquant pourquoi il a échoué (ou vous pouvez vérifier vos journaux pour une ligne ==> La publication a échoué à supprimer: ... ).


7 commentaires

Je ne sais pas pourquoi mais cela ne montre aucun message flash. J'obtiens le même résultat (rafraîchir la page)


C'est probablement parce que vous n'avez pas configuré votre mise en page pour afficher les messages flash dans la vue. Pouvez-vous voir ce que disent les journaux? Vous devriez voir une ligne pour ==> Le message n'a pas pu être supprimé dans vos journaux quelque part si le message n'a pas été supprimé.


Le journal ne mentionne pas la suppression. Il ne montre que le get pour la construction de la page.


J'ai ajouté un extrait pour afficher les messages flash dans votre vue, essayez de l'ajouter à votre fichier de vue et essayez-le à nouveau. Si le message ne parvient pas à être supprimé, vous devriez voir quelque chose rendu dans cette section de la vue.


Rien n'apparaît. Je ne pense pas que destroy soit en cours d'exécution? Le journal n'indique aucune tentative de suppression et il n'y a pas de message flash. Bien que mon contrôleur et ma vue soient exactement comme ce qui précède.


Il se peut que l'action destroy ne soit pas du tout frappée car l'UJS n'est pas chargé pour la page (ce qui vous permet d'avoir des liens de suppression). Pouvez-vous vérifier que votre page charge la bibliothèque rails-ujs?


La solution était d'utiliser button_to au lieu de link_to



0
votes

La solution était d'utiliser button_to au lieu de link_to

Cela a révélé une erreur supplémentaire qui m'a obligé à définir l'association has_many au-dessus / avant les associations has_many: through dans le modèle Post.

Je ne sais pas pourquoi link_to ne fonctionne pas dans ce cas.


0 commentaires