【发布时间】:2020-09-09 20:40:51
【问题描述】:
我的 Ruby on Rails 项目中有一些 Ruby 代码。
我正在格式化一些数据,所以我打电话给attributes.extract! 以从我的模型中获取我需要的字段。
我最近注意到,有时无法按预期提取数据。我意识到我需要一个 splat 运算符。但这很奇怪,因为我确实注意到有时在我的 Rails 项目中调用该方法时,它有时会在不使用 splat 运算符的情况下提取数据。但是当我从我的 Rails 控制台运行代码时,它永远不会提取数据,除非我添加 splat 运算符。
这是有问题的代码
# in a service file, let's call it service.rb
def self.format_user_home_address_data(user)
# This doesn't work in the console but sometimes works when run in my Rails project
home_address_data = user.attributes.extract!(User::HOME_ADDRESS_FIELDS)
home_address_data[:address_type] = "home"
home_address_data
end
# at the end this method will sometimes return { address_type: "home" } or
# sometimes it'll actually return the extracted attributes as expected
HOME_ADDRESS_FIELDS 只是一个数组,其值为["address_line_1", "city", "state", "zip"]
无论如何,我知道要让它正常运行,我需要这样做
home_address_data = user.attributes.extract!(*User::HOME_ADDRESS_FIELDS)
但是有谁知道为什么我这么长时间没有添加 splat 运算符就可以逃脱?是否有一些 Ruby on Rails 魔法只是偶尔发生?有什么关系?
【问题讨论】:
-
产生令人惊讶的行为的输入是什么?
-
该方法的唯一输入始终是用户对象。我认为可能会导致奇怪问题的唯一一件事是我使用
before_create来分配地址字段。创建用户后,我将其发送到我的服务类(我之前格式化数据),然后在服务类中有另一种方法,然后将其发送到 API 端点。服务方法本身就是在这里调用这个格式化方法。
标签: arrays ruby-on-rails ruby splat