如何将图片与主题关联

您好 @Discourse

我创建了一个将图像上传到帖子的插件,并将文件路径保存在 custom_fields 中。但是,Discourse 会删除所有为帖子上传的图像,因为它将未链接的图像视为孤立图像。因此,谁能指导我如何将上传的图像链接到相应的帖子?

我尝试更新 image_upload_id,但不知何故它没有更新 topic 表中的列值。

任何建议都将非常有帮助!

谢谢!

有一个 插件 API 函数 register_upload_in_use

有关如何使用它的示例,请参阅 Chat 插件中的代码

1 个赞

抱歉,那只是一个部分回复,它只会阻止图片孤立。你应该能够从你的代码中设置 topic.image_upload_id,但当帖子被重新烘焙时,它会被覆盖。所以你也应该挂钩到重新烘焙代码。

您能指导我如何做到这一点吗?如果您能分享一些例子,因为我对 Ruby 不太了解,但我可以用 JavaScript 工作,而且我刚开始接触 Discourse,所以对 Discourse 的定制不太了解 :sweat_smile:

这是更新 image_upload_id 主题的代码,它在 CookedPostProcessor::update_post_image 中。

所以你可以 猴子补丁这个函数,然后做类似的事情

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 已为帖子和主题更新,但图片仍被删除。我确实使用了 register_upload_in_use API 函数。

我添加了以下代码来检查主题的 custom_fields,其中 topic_file_upload 是字段名。这是正确的方法吗?

  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
1 个赞

它有图片网址,但我已在自定义字段中添加了新字段用于图片 ID,现在正按您在代码中提到的方式检查 ID。我认为,如果我使用了下面的代码,也许它应该可以工作?

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

奇怪 - 如果它有 URL,它应该可以正常工作,因为 value: [upload.url, upload.sha1] 也会匹配 URL 和 SHA1 :thinking:

感谢 @RGJ 的帮助!对我来说,id 比 url 好用。

1 个赞

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