tl;dr
Pour certains messages, l’appel de PostRevisor met post_id à nil. Suis-je fou ?
Réponse : Non. PostRevisor accède à post.topic, qui est nil pour un message dans un sujet supprimé. Et ensuite, il met post.topic à nil, ce qui à son tour met post.topic_id à nil.
Je pense que PostRevisor devrait obtenir le sujet comme ceci :
@topic = topic || Topic.with_deleted.find_by(id: post_topic_id)
plutôt que comme ceci :
@topic = topic
post=Post.find_by(topic_id: 179227, post_number: 12)
post.topic_id => 179227
pr=PostRevisor.new(post)
post.topic_id => nil
L’histoire complète
Je travaille sur un script qui corrige les liens goo.gl (le service étant bientôt abandonné, le script trouve les liens goo.gl, récupère vers quoi ils redirigent et remplace l’URL goo.gl par celle vers laquelle elle est dirigée. Cela fonctionne la plupart du temps.
Mais
Pour un certain nombre de messages, tout semble bien se passer, mais ensuite PostRevisor échoue car post.acting_user est nil. Et ensuite, dans mon rescue, il semble que topic_id soit nil, mais ce n’est pas le post qui est nil, car il a toujours un post_number.
begin
puts "Revising (#{count}/#{total_posts}) https://mysite.com/t/#{post.topic_id}/#{post.post_number}"
puts "missing topic_id for post #{post.id}" if !post.topic_id
next if !post.topic_id
PostRevisor.new(post).revise!(system_user, raw: new_raw, **revision_options)
rescue => e
puts "cannot revise (number: #{count} https://tw.forumosa.com/t/#{post.topic_id}/#{post.post_number}): #{e}"
end
FIXING!!: https://goo.gl/maps/XaNG
B7qaZGzhBmM78 -----> https://www.google.com/maps/place/%E6%AD%A5%E9%81%93%E5%92%96%E5%95%A1%E9%A4%A8Cafe+Strada/@22.6300414,120.3153591,17z/data=!3m1!4b1!4m5!3m4!1s0x346e04944a9b3471:0x520c1f01c3d62e57!8m2!3d22.6301115!4d120.3175543?shorturl=1
Revising (680/1773) https://mysite.com/t/207069/1817
cannot revise (number: 680 https://mysite.com/t//1817): undefined method `acting_user=' for nil
Pour la grande majorité des messages, cela fonctionne très bien, mais pour un sous-ensemble d’entre eux, cela échoue comme ceci. Et si j’exécute le code ligne par ligne à la main, j’obtiens la même chose. Il commence à ressembler à ceci, cependant, si je fais un pr=PostRevisor.new(post), je vois que le message dans l’enregistrement pr n’a pas de topic_id et ensuite si j’inspecte le post, il a maintenant topic_id défini à nil.