如果存在值,则 Rails update_attributes,否则为 nil



On Rails 5.

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

我正在发出 API 请求以获取访问令牌和过期,但是,在许多情况下,expires_at不存在,在这种情况下,我希望值为零。

在我的控制器中,我正在做一些基本的事情,例如:

@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的方法是什么?很难找到答案。

听起来

你在这里走在正确的轨道上:

    @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?

如果您还想检查其他值,您可以执行更常规的操作。

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")

最新更新