Resumo
Para algumas postagens, chamar PostRevisor define post_id como nil. Estou louco?
Resposta: Não. PostRevisor acessa post.topic, que é nil para uma postagem em um tópico excluído. E então ele define post.topic como nil, o que por sua vez define post.topic_id como nil.
Acho que PostRevisor deveria obter o tópico assim:
@topic = topic || Topic.with_deleted.find_by(id: post_topic_id)
em vez de assim:
@topic = topic
post=Post.find_by(topic_id: 179227, post_number: 12)
post.topic_id => 179227
pr=PostRevisor.new(post)
post.topic_id => nil
A História Completa
Estou trabalhando em um script que corrige links goo.gl (o serviço está sendo desativado em breve, então o script encontra links goo.gl, busca para onde eles são redirecionados e substitui o URL goo.gl pelo que ele está sendo direcionado. Na maioria das vezes funciona.
Mas
Para várias postagens, tudo parece estar funcionando bem, mas então PostRevisor falha porque post.acting_user é nil. E então, em meu resgate, parece que o topic_id é nil, mas não é o post que é nil, porque ele ainda tem um post_number.
begin
puts "Revisando (#{count}/#{total_posts}) https://mysite.com/t/#{post.topic_id}/#{post.post_number}"
puts "topic_id ausente para 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 "não é possível revisar (número: #{count} https://tw.forumosa.com/t/#{post.topic_id}/#{post.post_number}): #{e}"
end
CORRIGINDO!!: 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/d
ata=!3m1!4b1!4m5!3m4!1s0x346e04944a9b3471:0x520c1f01c3d62e57!8m2!3d22.6301115!4d120.3175543?shorturl=1
Revisando (680/1773) https://mysite.com/t/207069/1817
não é possível revisar (número: 680 https://mysite.com/t//1817): método indefinido `acting_user=' para nil
Para a grande maioria das postagens, isso funciona bem, mas para um subconjunto delas, falha assim. E se eu executar o código manualmente linha por linha, obtenho o mesmo resultado. Parece, no entanto, que se eu fizer um pr=PostRevisor.new(post), vejo que o post no registro pr não tem topic_id e então, se eu inspecionar o post, ele agora tem topic_id definido como nil.