tl;dr
Per alcuni post, chiamare PostRevisor imposta post_id a nil. Sono pazzo?
Risposta: No. PostRevisor accede a post.topic, che è nil per un post in un topic eliminato. E poi imposta post.topic a nil, che a sua volta imposta post.topic_id a nil.
Penso che PostRevisor dovrebbe ottenere il topic in questo modo:
@topic = topic || Topic.with_deleted.find_by(id: post_topic_id)
piuttosto che in questo modo:
@topic = topic
post=Post.find_by(topic_id: 179227, post_number: 12)
post.topic_id => 179227
pr=PostRevisor.new(post)
post.topic_id => nil
La storia completa
Sto lavorando a uno script che corregge i link goo.gl (il servizio sta per essere dismesso, quindi lo script trova i link goo.gl, recupera a cosa sono reindirizzati e sostituisce l’URL goo.gl con quello a cui è diretto. Funziona per la maggior parte).
Ma
Per un certo numero di post, sembra che tutto vada bene, ma poi PostRevisor fallisce perché post.acting_user è nil. E poi, nel mio rescue, sembra che topic_id sia nil, ma non è il post ad essere nil, perché ha ancora 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
Per la stragrande maggioranza dei post, questo funziona bene, ma per un certo sottoinsieme di essi, fallisce in questo modo. E se eseguo il codice manualmente riga per riga, ottengo lo stesso risultato. Inizia a sembrare, però, che se faccio un pr=PostRevisor.new(post), vedo che il post nel record pr non ha topic_id e poi se ispeziono il post ora ha topic_id impostato a nil.