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>
3 Réponses :
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
La publication a des modèles associés
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: ...
).
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
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.
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