Cómo enlazar imágenes con el tema

Hola @Discourse,

He creado un plugin que sube una imagen a los temas y guardo la ruta del archivo en custom_fields. Sin embargo, Discourse elimina todas las imágenes que se suben para los temas, considerando que las imágenes huérfanas no están vinculadas a los temas. Por lo tanto, ¿alguien puede guiarme sobre cómo puedo vincular las imágenes subidas a los temas correspondientes?

Intenté actualizar el image_upload_id, pero de alguna manera no se actualiza el valor de las columnas en la tabla topic.

¡Cualquier consejo sería de gran ayuda!

¡Gracias!

Hay una función de API de plugin register_upload_in_use

Como ejemplo de cómo usarla, consulta el código en el plugin de Chat.

1 me gusta

Lo siento, esa fue solo una respuesta parcial, solo evitará que las imágenes queden huérfanas. Deberías poder establecer topic.image_upload_id desde tu código, pero se sobrescribirá cuando se vuelva a hornear el HTML de una publicación. Así que también deberías engancharte al código de horneado.

¿Puedes guiarme sobre cómo puedo hacer eso? Si puedes compartir algunos ejemplos, porque no sé mucho de Ruby, pero puedo trabajar con JavaScript y también soy nuevo en Discourse, así que no sé mucho sobre la personalización de Discourse :sweat_smile:

Aquí está el código que actualiza el tema image_upload_id, está en CookedPostProcessor::update_post_image

Así que lo que podrías hacer es aplicar un monkey patch a esa función y luego hacer algo como

def update_post_image
  super # llama al original
  if @post.custom_fields[:your_field_name_upload_id]
    upload_id = @post.custom_fields[:your_field_name_upload_id]
    @post.update_column(:image_upload_id, upload_id) # post
    if @post.is_first_post? # topic
        @post.topic.update_column(:image_upload_id, upload_id)
    end
  end
end

Se ha actualizado el image_upload_id para publicaciones y temas, pero las imágenes todavía se eliminan. Sí utilicé la función de API register_upload_in_use.

He agregado el siguiente código para verificar en los custom_fields del tema, donde topic_file_upload es el nombre del campo. ¿Es esta la forma correcta de hacerlo?

  if respond_to?(:register_upload_in_use)
    register_upload_in_use do |upload|
        TopicCustomField.where(
            name: 'topic_file_upload',
            value: [upload.url, upload.sha1]
        ).exists?
    end
  end

¿Qué contiene TopicCustomField? Supongo que contiene el ID de carga.

En ese caso, debería ser más parecido a

  if respond_to?(:register_upload_in_use)
    register_upload_in_use do |upload|
        TopicCustomField.where(
            name: 'topic_file_upload',
            value: upload.id
        ).exists?
    end
  end
1 me gusta

Tiene la URL de la imagen, pero he añadido un nuevo campo en los campos personalizados para el ID de la imagen y ahora estoy comprobando el ID como mencionaste en el código. Creo que si hubiera utilizado el siguiente código, ¿quizás debería funcionar?

TopicCustomField.where(
            name: 'topic_file_upload',
            value: upload.url
        ).exists?

Extraño: si tuviera la URL, debería haber funcionado antes, ya que value: [upload.url, upload.sha1] coincidiría con la URL y también con el SHA1 :thinking:

Gracias @RGJ por la ayuda. Id funcionó para mí en lugar de url.

1 me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.