Как связать изображения с темой

Привет @Discourse,

Я создал плагин, который загружает изображения в темы, и сохраняю путь к файлу в custom_fields. Однако Discourse удаляет все загруженные для тем изображения, считая их «осиротевшими», так как они не связаны с темами. Не могли бы вы подсказать, как привязать загруженные изображения к соответствующим темам?

Я пытался обновить image_upload_id, но somehow это не обновляет значение столбца в таблице topics.

Любой совет будет очень полезен!

Спасибо!

Существует функция API плагинов register_upload_in_use.

Пример использования см. в коде плагина Chat.

Извините, это был лишь частичный ответ — это предотвратит только сиротство изображений. Вы можете установить topic.image_upload_id в своём коде, но это значение будет перезаписано при повторной обработке HTML поста. Поэтому вам также следует подключить свой код к процессу rebake.

Можете, пожалуйста, подсказать, как это сделать? Было бы здорово, если бы вы могли привести пример, так как я не очень хорошо знаю Ruby, но могу работать с JavaScript. Кроме того, я новичок в Discourse и мало что знаю о кастомизации :sweat_smile:

Вот код, который обновляет поле image_upload_id для темы. Он находится в методе CookedPostProcessor::update_post_image:

Так что вы можете сделать monkey patch для этого метода, а затем выполнить что-то вроде:

def update_post_image
  super # вызов оригинального метода
  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) # пост
    if @post.is_first_post? # тема
        @post.topic.update_column(:image_upload_id, upload_id)
    end
  end
end

Обновлен image_upload_id для поста и темы, но изображения всё ещё удаляются. Я использовал функцию API register_upload_in_use.

Я добавил код ниже, чтобы проверить поле topic_file_upload в custom_fields темы. Правильно ли я это делаю?

  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

Что содержит TopicCustomField? Я предполагаю, что там хранится ID загрузки?

В таком случае это должно выглядеть примерно так:

  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

Там есть URL изображения, но я добавил новое поле в пользовательские поля для ID изображения и теперь проверяю ID, как вы указали в коде. Я полагаю, что если бы я использовал код ниже, это должно было бы сработать, возможно?

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

Странно — если бы там был URL, это должно было сработать раньше, так как value: [upload.url, upload.sha1] сопоставляло бы и URL, и SHA1 :thinking:

Спасибо @RGJ за помощь! Вместо url у меня сработал Id.