# PostRevisor non può revisionare post in topic eliminati

**URL:** https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130
**Category:** Bug
**Created:** [14 Gennaio 2025, 8:36pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130 "2025-01-14T20:36:53Z")
**Posts on this page:** 15
**Page:** 1

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14 Gennaio 2025, 8:36pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/1 "2025-01-14T20:36:53Z")

</div>

### 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:

```plaintext
  @topic = topic || Topic.with_deleted.find_by(id: post_topic_id)

```

piuttosto che in questo modo:

```plaintext
  @topic = topic

```

```plaintext
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`.

```ruby
      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

```

```plaintext
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.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [14 Gennaio 2025, 8:39pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/2 "2025-01-14T20:39:07Z")

</div>

Per curiosità, c’è un motivo per cui non stai modificando direttamente il modello Post?

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14 Gennaio 2025, 8:45pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/3 "2025-01-14T20:45:56Z")

</div>

> [@merefield](#):
>
> c’è un motivo per cui non stai modificando direttamente il modello Post?

Perché se stai modificando 3000 post con `gsub` e un’espressione regolare complicata con un sacco di casi limite (correzione: `goo.gl`, `http://goo.gl`, `https://goo.gl`, ma non toccare `https://maps.app.goo.gl`, o `https://map.goo.gl`, e forse potresti essere limitato nella frequenza da `goo.gl`, e così via) potresti voler recuperare il post prima di averlo completamente rovinato!

È stato molto utile poter guardare le modifiche e vedere il prima e il dopo ed essere in grado di annullare! Una versione trasformerebbe `https://maps.app.goo.gl/abd12` in qualcosa come `https://maps.app.https://maps.google.com/;lkajw3rpoazse;flknmase;faijserfasefklasdfa`, per esempio.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [14 Gennaio 2025, 8:47pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/4 "2025-01-14T20:47:00Z")

</div>

_ha_ senso 🙂

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [14 Gennaio 2025, 8:50pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/5 "2025-01-14T20:50:02Z")

</div>

Qualche anno fa c’era uno script simile che ho cercato di far eseguire a CDCK per un cliente e loro hanno detto (con parole mie, non loro) “Amico. Pensi che eseguiremo il tuo codice che cambia alla leggera un numero enorme di post e non c’è modo di annullarlo? Ripensaci.”

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [14 Gennaio 2025, 8:53pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/6 "2025-01-14T20:53:28Z")

</div>

Sì, un altro approccio è eseguirlo su un backup in un’area controllata. Ma adoro la tua soluzione.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [15 Gennaio 2025, 4:33pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/7 "2025-01-15T16:33:05Z")

</div>

Ecco l’inizializzatore:

> <https://github.com/discourse/discourse/blob/main/lib/post_revisor.rb#L47-L53>

Quindi, in qualche modo il post ci arriva e, sebbene `post_id` abbia un valore, `post` no?

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [15 Gennaio 2025, 4:38pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/8 "2025-01-15T16:38:47Z")

</div>

> [@pfaffman](#):
>
> ```plaintext
> post=Post.find_by(topic_id: 179227, post_number: 12)
> post.topic_id => 179227
> pr=PostRevisor.new(post)
> post.topic_id => nil
> 
> ```

Questo non riesco a riprodurlo.  
L’ultimo post.topic\_id non è nil e, come previsto, è una ripetizione del risultato precedente

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [15 Gennaio 2025, 4:40pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/9 "2025-01-15T16:40:24Z")

</div>

> [@merefield](#):
>
> Questo non riesco a riprodurlo.

Sì. Ha funzionato sulla maggior parte dei post. C’è qualcosa di strano con alcuni di essi.

```plaintext
[63] pry(main)> post.topic_id
=> 179227
[64] pry(main)> post.topic
=> nil
[65] pry(main)>

```

Sono abbastanza sicuro che non dovrebbe succedere. 🤷

Ma aspetta:

```plaintext
Topic.find(post.topic_id)
ActiveRecord::RecordNotFound: Impossibile trovare Topic con 'id'=179227 [DOVE "topics"."deleted_at" IS NULL]
from /var/www/discourse/vendor/bundle/ruby/3.3.0/gems/activerecord-7.2.2.1/lib/active_record/relation/finder_methods.rb:428:in `raise_record_not_found_exception!'

```

L’argomento è stato eliminato.

Quindi la domanda è se sia un bug il fatto che non si possano rivedere i post in argomenti eliminati.

Suppongo che non mi importerà e farò in modo che il mio script controlli `post.topic` per nil piuttosto che `post.topic_id`.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [15 Gennaio 2025, 4:53pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/10 "2025-01-15T16:53:21Z")

</div>

C’è una bella mancanza di integrità lì con la chiave esterna!

Penso che alcuni dei meccanismi di protezione (eufemismo) siano disattivati perché le tabelle sono solitamente troppo grandi.

Forse qualcuno ha eseguito un topic.delete invece di destroy. Oops.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [15 Gennaio 2025, 5:05pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/11 "2025-01-15T17:05:37Z")

</div>

La mia ricerca dei messaggi era simile a `Post.where("raw like '%goo.gl%'"), e questo restituisce i messaggi appartenenti a discussioni eliminate. Poi questi messaggi hanno un `topic\_id`, ma non un oggetto `topic`. Credo ci sia un modo per far sì che `Topic.find` restituisca anche le discussioni eliminate (perché un amministratore può vedere quelle discussioni, ed è per questo che ero così confuso. Quella piccola icona del cestino è facile da non notare).

Quindi è qualcosa come questo:

```plaintext
deleted_topic = Topic.with_deleted.find_by(id: 123)

```

Forse avrei dovuto fare così e aggiornare il messaggio prima di chiamare il `PostRevisor`?

Ma nell’interfaccia utente **posso** aggiornare un messaggio in una discussione eliminata, quindi penso che

```plaintext
def initialize(post, topic = post.topic)
  @post = post
  @topic = topic
  # Assicuriamoci di avere un'unica istanza di Topic
  post.topic = topic
end

```

dovrebbe essere

```plaintext
def initialize(post, topic = post.topic)
  @post = post
  @topic = topic || Topic.with_deleted.find_by(id: post_topic_id)
  # Assicuriamoci di avere un'unica istanza di Topic
  post.topic = topic
end

```

Sposto questa questione in #Contribute > Bug nel caso qualcun altro pensi che sia un bug.

Ma questo funziona:

```plaintext
        if !post.topic # i messaggi nelle discussioni eliminate non hanno un oggetto topic e fanno crashare PostRevisor
           post.topic = Topic.with_deleted.find_by(id: post.topic_id)
           next if !post.topic
        end
        PostRevisor.new(post).revise!(system_user, raw: new_raw, **revision_options)

```

C’erano messaggi in 3 discussioni che hanno fatto crashare Rails. Rinuncio a questo approccio. 🙂

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [16 Gennaio 2025, 5:22pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/12 "2025-01-16T17:22:27Z")

</div>

E un’altra versione di quanto sopra che esegue `deleted_topic = Topic.with_deleted.find_by(id: 123)` per aggiornare `post.topic` funziona anche.\n\nSembra ancora un bug, però. O forse, dato che il core fa qualcos’altro per gestire questo, non è un bug.

---

<div class="post-metadata">

### Author: ![merefield](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/merefield/32/176214_2.png) [@merefield](https://meta.discourse.org/u/merefield)
#### Post date: [16 Gennaio 2025, 6:03pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/13 "2025-01-16T18:03:18Z")

</div>

O una funzionalità mancante (e quindi una specifica)?

Online, questo non verrà mai chiamato per i Post in Argomenti eliminati?

Concordo, tuttavia, sul fatto che dovrebbe gestirlo correttamente 🤔

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [16 Gennaio 2025, 7:16pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/14 "2025-01-16T19:16:50Z")

</div>

> [@merefield](#):
>
> O una funzionalità mancante (e quindi una specifica)?

Forse

> [@merefield](#):
>
> Online, questo non verrà mai chiamato per i Post in Argomenti eliminati?

Stanno chiaramente facendo qualcosa per consentirlo sui post in argomenti eliminati, probabilmente come sto facendo io.

> [@merefield](#):
>
> Concordo, tuttavia, che dovrebbe gestirlo correttamente 🤔

Sì. Qualcuno che prende tali decisioni può spostarlo di nuovo in #Dev se lo ritiene appropriato.

---

<div class="post-metadata">

### Author: ![pfaffman](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/pfaffman/32/120154_2.png) [@pfaffman](https://meta.discourse.org/u/pfaffman)
#### Post date: [15 Febbraio 2025, 7:17pm UTC](https://meta.discourse.org/t/postrevisor-cant-revise-posts-in-deleted-topics/347130/15 "2025-02-15T19:17:05Z")

</div>

Questo argomento è stato chiuso automaticamente 30 giorni dopo l’ultima risposta. Non sono più consentite nuove risposte.
