tl;dr
Beim Aufruf von PostRevisor für einige Beiträge wird post_id auf nil gesetzt. Bin ich verrückt?
Antwort: Nein. PostRevisor greift auf post.topic zu, was für einen Beitrag in einem gelöschten Thema nil ist. Und dann setzt es post.topic auf nil, was wiederum post.topic_id auf nil setzt.
Ich denke, PostRevisor sollte das Thema so abrufen:
@topic = topic || Topic.with_deleted.find_by(id: post_topic_id)
anstatt so:
@topic = topic
post=Post.find_by(topic_id: 179227, post_number: 12)
post.topic_id => 179227
pr=PostRevisor.new(post)
post.topic_id => nil
Die ganze Geschichte
Ich arbeite an einem Skript, das goo.gl-Links repariert (der Dienst wird bald eingestellt, daher findet das Skript goo.gl-Links, ruft ab, wohin sie weitergeleitet werden, und ersetzt die goo.gl-URL durch diejenige, zu der sie weitergeleitet werden. Es funktioniert größtenteils.
Aber
Bei einigen Beiträgen scheint alles gut zu laufen, aber dann schlägt PostRevisor fehl, weil post.acting_user nil ist. Und dann, in meiner Ausnahmebehandlung, scheint es, dass topic_id nil ist, aber es ist nicht der post, der nil ist, da er immer noch eine post_number hat.
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
Bei den allermeisten Beiträgen funktioniert dies einwandfrei, aber bei einer Teilmenge davon schlägt es fehl. Und wenn ich den Code Zeile für Zeile von Hand ausführe, erhalte ich dasselbe Ergebnis. Es scheint jedoch, dass, wenn ich pr=PostRevisor.new(post) mache, ich sehe, dass der Beitrag im pr-Datensatz keine topic_id hat und dann, wenn ich den post inspiziere, hat er jetzt topic_id auf nil gesetzt.