API创建帖子和锁定主题的问题

我正在通过 API(gem)锁定主题,如果链中只有锁定命令,我可以成功锁定并解锁。但是,如果我先在主题中创建帖子,然后执行锁定命令,它会在创建帖子后锁定主题,但随即又立即解锁了!

这非常奇怪。如果我只创建帖子,或者只锁定主题,一切正常。但如果我尝试同时执行这两个操作,主题最终会自动解锁!

目前我决定暂时不锁定主题,但想在此发帖,看看这是否值得进一步调查。

3 个赞

你是在创建帖子后立即锁定该主题吗?如果是,可以尝试等待一分钟,然后再尝试锁定,看看是否能保持锁定状态。仅供参考。

1 个赞

发现得不错,我有空会调查一下。将这两个 API 调用合并为一个请求并不完全符合 UI 中的操作方式(无法创建已锁定的新主题),因此该 API 端点很可能没有检查锁定标志,或者在创建主题时默认将其设置为未锁定。

3 个赞

我今天花了一点时间研究了一下,看看这是否是一个简单的改动,但许多可以应用于主题的操作最好在主题创建之后执行。其中一个原因是,我们确实应该使用 TopicStatusUpdater 来关闭主题,而不是直接在数据库中更新它。但是,当我们在创建主题时更新状态,似乎会在第一篇文章创建之前就关闭主题,从而导致这种奇怪的行为:

目前,您需要发出两个独立的 API 请求:首先向 /posts.json 发送 POST 请求,如果成功,再向 /t/{id}/status.json 发送 PUT 请求。

2 个赞

你好 Blake,我尝试的这个主题已经存在了 :slight_smile:

我的流程如下:

  bot.create_post(topic_id, post_content)
  bot.switch_to_master_bot!("system")
  bot.lock_topic("", topic_id)

  def create_post(topic_id, post_content)
    @client.create_post(
      topic_id: "#{topic_id}",
      raw: "#{post_content}",
    )
  end

  def lock_topic(slug, topic_id)
    params = { status: 'closed', enabled: true }
    @client.change_topic_status(slug, topic_id, params)
  end

我使用的是 Discourse API Gem。

你的意思是上述代码应该能工作(或者对你来说已经可以工作了)?

1 个赞

哦,我明白了,我确实误解了您具体在做什么。我以为您是想同时创建主题并关闭它。不过,我之前的回复仍然适用于在现有主题中创建帖子并同时关闭该主题的情况。您只需使用两个独立的端点即可。

3 个赞

API Gem 是否使用了正确的/独立的端点,Blake?(我原以为它们是这样做的?)

client.create_postclient.change_topic_status 方法属于 API Gem 的一部分 :slight_smile:

2 个赞

是的,这些方法使用了正确的端点:slightly_smiling_face

3 个赞

那应该可以了吧?(但并没有:sob:)

1 个赞

我刚刚在本地测试了你的代码,对我来说运行正常。具体哪里出问题了?我猜测帖子已经创建成功,但主题没有被关闭?如果是这样,能否使用 puts 输出 @client.change_topic_status(slug, topic_id, params) 的结果?

另外,在查看 api gem 中的代码时,我发现我们根本没有使用 slug 变量,所以我会更新代码将其移除。

2 个赞