• [^] # Re: Validation des liens et bookmarks

    Posté par (site web personnel, Mastodon) . En réponse à l’entrée du suivi Corruption de dépêches et URL avec des caractères non ascii. Évalué à 2 (+0/-0).

    Pour la réorganisation, on a, dans le modèle de news, le code:

     def reorganize(params)
     Paragraph.where(news_id: self.id).delete_all
     self.attributes = params
     create_parts
     save
     unlock
     end

    On voit bien que la première étape est de supprimer tous les paragraphes.

    La ligne create_parts va recréer tous les paragraphes de la première et de la seconde partie.

    L'appel à create_new_version est définit pour s'exécuter après le save (after_save).

    Il faut savoir que, si un lien est invalide, le modèle link lève une exception sans gestion d'erreur et donc fait arrêter nette la procédure.

    Ce que je ne sais pas, c'est si le modèle de link est appelé au moment de faire self.attributes = params ou au moment de faire save.

    En plus, je ne sais pas si Rails fait des transactions dans MySQL, donc c'est un peu compliqué à expliquer ce qui se passe juste en regardant le code. Il faudrait que je reproduise aussi pour mieux analyser.

    Mais en tout cas, s'il n'y a pas de transaction SQL, la news serait effectivement dans un mauvais état: les paragraphes ont été détruits et les nouveaux body/wiki_body n'ont pas été sauvés.

    Mon Pull Request fait en sorte que le modèle link ne lève plus une exception brute, mais remonte une erreur de validtion. Au moins, ça n'arrête plus le processus d'un coup, mais ça perturbe uniquement les modifications sur les liens.