Resumen
Para algunas publicaciones, llamar a PostRevisor establece post_id en nil. ¿Estoy loco?
Respuesta: No. PostRevisor accede a post.topic, que es nil para una publicación en un tema eliminado. Y luego establece post.topic en nil, lo que a su vez establece post.topic_id en nil.
Creo que PostRevisor debería obtener el tema así:
@topic = topic || Topic.with_deleted.find_by(id: post_topic_id)
en lugar de así:
@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 historia completa
Estoy trabajando en un script que corrige enlaces goo.gl (el servicio está desapareciendo pronto, por lo que el script encuentra enlaces goo.gl, obtiene a qué se redirigen y reemplaza la URL goo.gl con la que se redirige. En su mayor parte funciona.
Pero
Para muchas publicaciones, todo parece ir bien, pero luego PostRevisor falla porque post.acting_user es nil. Y luego, en mi rescate, parece que topic_id es nil, pero no es el post el que es nil, porque todavía tiene un post_number.
begin
puts "Revisando (#{count}/#{total_posts}) https://mysite.com/t/#{post.topic_id}/#{post.post_number}"
puts "topic_id faltante para la publicación #{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 "no se puede revisar (número: #{count} https://tw.forumosa.com/t/#{post.topic_id}/#{post.post_number}): #{e}"
end
¡¡CORRIGIENDO!!: 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
Revisando (680/1773) https://mysite.com/t/207069/1817
no se puede revisar (número: 680 https://mysite.com/t//1817): método no definido `acting_user=' para nil
Para la gran mayoría de las publicaciones, esto funciona bien, pero para un subconjunto de ellas, falla de esta manera. Y si ejecuto el código manualmente línea por línea, obtengo lo mismo. Sin embargo, está empezando a parecer que, si hago un pr=PostRevisor.new(post), veo que la publicación en el registro pr no tiene topic_id y luego, si inspecciono la post, ahora tiene topic_id establecido en nil.