如果值存在,则更新Rails的属性(update_attributes),否则设为nil。

3

在Rails 5中。

我有一个具有access_tokenexpires_at属性的服务模型。

我正在进行API请求以获取访问令牌和过期时间,然而,在许多情况下,expires_at不存在,在这种情况下,我希望该值为nil。

在我的控制器中,我做了一些基本的操作:

@service.update_attributes(
    access_token: api_response["access_token"],
    expires_at: Time.at(api_response["credentials"]["expires_at"])
  )

仅在API响应包含“expires_at”时更新它的正确方法是什么?
我考虑设置一个变量(如果有的话):
if api_response["credentials"]["access_token"].present?
  expiry = api_response["credentials"]["access_token"]
else
  expiry = nil
end

然后进行更新,例如...
@service.update_attributes(expires_at: expiry)

但这似乎不是正确的做法。如果我需要检查API响应中的多个值,就会有很多额外的代码来检查是否存在。

在Rails中,正确的做法是什么?我找不到答案。

2个回答

0

看起来你在这方面走在了正确的轨道上:

    @service.access_token = api_response["access_token"]
    @service.expires_at = Time.at(api_response["credentials"]["expires_at"]) if api_response["credentials"]["expires_at"].present?
    @service.save if @service.changed?

谢谢您的快速回答。Time.at()需要一个有效的值,这就是为什么我会收到一个错误。 - Kathan

0

如果你想检查其他值,你可以做一些更通用的操作。

def check_and_return(api, value = "access_token")
  api[value].present? ? expiry = Time.at(api[value]) : expiry = nil
  return expiry
end
expiry = check_and_return(api_response["credentials"])
@service.update_attributes(expires_at: expiry)

通过这个,你也可以传递其他的值,例如:

check_and_return(api_response["other_credentials"], "other_token")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接