【问题标题】:Ruby gem persist valuesRuby gem 持久值
【发布时间】:2021-08-29 15:58:24
【问题描述】:

我正在开发一个 gem (https://rubygems.org/gems/apipie-postman),它会根据您的 Apipie 输出自动生成 Postman 文档。现在,我遇到的一个问题是每次运行 rake 任务来生成集合时,它都会生成一个新集合,而不是更新旧集合。

我正在尝试将集合 uid 保存为常量,所以如果它是 nil 我应该创建集合,否则我应该根据 uid 更新集合。

到目前为止,我尝试在课堂上使用attr_accessor,或使用Object.const_set('key', value)。问题是每次我运行 rake 任务(这就是我设置逻辑的方式 - 开发人员必须运行 rake 任务来生成文档),self.attr_accessor_value 为 nil,Object.const_defined?('key') 也为 nil .

parse_apipie_file_and_create_postman_body

if Object.const_defined?('postman_uid')
  Faraday.public_send(:put, "https://api.getpostman.com/collections/#{Object.const_get('postman_uid')}", body, headers)
else
  response = Faraday.public_send(:post, 'https://api.getpostman.com/collections/', body, headers)

  if response.status == 200
    Object.const_set('postman_uid', JSON.parse(response.body)['collection']['uid'])
  end
end

【问题讨论】:

  • 你能分享一些你想要做什么的示例代码吗?如果没有示例代码,别人可能很难理解您面临的问题。
  • 是的,当然。我将更新问题以包含信息
  • 这种方法存在很多问题,我什至不知道从哪里开始......这不是常量的用途!常量是全局引用。使用Object.const_set 将在全局命名空间中动态创建一个常量,这很少是合理的。此外,您的代码会引发异常,因为 postman_uid 是不正确的常量名称。您正在寻找的是一种记忆阅读器方法。将您的 rake 任务逻辑包装在服务对象中以使其更容易。

标签: ruby-on-rails ruby rubygems


【解决方案1】:

我正在尝试将集合 uid 保存为常量,所以如果它是 nil 我应该创建集合,否则我应该根据 uid 更新集合。

我认为这不是一个好主意,因为如果有几个人想要生成/更新文档会怎样?每个都有不同的集合 ID?

我认为您应该在配置中询问 uuid,或者您可以通过 API 端点获取它。

【讨论】:

  • 是的,我通过 API 端点获取它。最初,将完成调用,将创建集合,然后我想在那台机器上将 uid 存储为常量或其他内容。我会避免将其放入 .txt 文件或类似文件中。
  • 我在问题中添加了一些代码,也许这对整体情况有所帮助
  • 你不能这样做,因为除非你将常量写入你的 Ruby 文件,否则一旦你的程序退出它就会消失。您应该尝试每次通过 GET API 端点获取它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多