Ruby为JSON.parse更新哈希数组中的所有相同对象数据

时间:2016-11-09 00:31:52

标签: ruby ruby-on-rails-4

所以a = first

=> <Ng::EntityConfiguration id: 15903, entity_id: 1, entity_type: "Ng::Company", key: "wpa2.psk", value: "[{"ssid":"Main-Hall-Staff","password":"abc123","dhcp":"Enabled"},{"ssid":"Main-Hall-Guest","password":"def456","dhcp":"Disabled"}]", created_at: "2016-11-08 11:03:51", updated_at: "2016-11-08 11:03:51", name: "WIFI/Main Hall">

我有a.value将返回:

"[
  {\"ssid\":\"Main-Hall-Staff\",\"password\":\"abc123\"},
  {\"ssid\":\"Main-Hall-Guest\",\"password\":\"def456\"}
]"

我的问题是,如何更新密码值并保存?

new_pass1 = 'xyz123'
new_pass2 = 'xyz321'

我已尝试过代码(如下所示),但如果我只有一个hash_array,则只会更新第一个密码。

这是我的完整代码

def encrypt_pass
  # get the actual password
  parse = JSON.parse(self.value)
  get_pass = parse.last['password']

  # encrypt the password
  crypt = ActiveSupport::MessageEncryptor.new(ENV["SECRET_KEY_BASE"])
  encrypted = crypt.encrypt_and_sign(get_pass)

  # save the new encrypted password
  parse.first['password'] = encrypted
  encrypt_pass = parse.to_json
  self.value = encrypt_pass
end

1 个答案:

答案 0 :(得分:1)

为了清楚起见,您是否正在尝试将记录中的Main-Hall-Staff密码和Main-Hall-Guest密码(所有密码)更新为自己的加密版本?我假设这种方法是在某种类型的before_save回调中调用的?如果您显示更多与模型相关的代码,我可以为您提供更多详细信息。

def encrypt_pass
  # Changed the name to devises, always use easy to understand naming
  # Also rescuing from a JSON parse error, this isnt always recommended
  # as it hides other errors that might be unrelated to parsing
  devices = JSON.parse(self.value) rescue []
  crypt = ActiveSupport::MessageEncryptor.new(ENV["SECRET_KEY_BASE"])

  devices.each do |device|
    # get the actual password
    password = device['password']

    # encrypt the password
    encrypted_pass = crypt.encrypt_and_sign(password)

    # Save the encrypted password
    device['password'] = encrypted_pass
  end

  self.value = devices.to_json
end

希望您在调用此方法时有一些逻辑,因为您不想加密已加密的密码。