如何定位file.yml中匹配登录凭证的Account对象并仅更新其card属性
实现方案
这个场景的核心注意点是YAML文件里带!ruby/object:Account的Ruby自定义对象标签,加载和写回的时候必须保留这个标签,不能破坏原文件结构,也不能改动非目标账号的任何内容,具体实现如下:
核心流程
- 全量加载YAML文件内容,允许解析Account自定义类型,避免丢失对象标签
- 遍历账号列表,精确匹配
login、password和当前登录凭证完全一致的Account实例 - 仅修改匹配到实例的
card字段,其余字段、其余账号对象一律不做改动 - 全量将修改后的账号列表写回原文件,自动保留原有YAML格式和对象标签
代码实现
Ruby标准库自带YAML能力,不需要额外安装依赖,直接用即可:
require 'yaml' # 以下两个值从当前登录态中获取,此处为示例写死 current_user_login = "Anton1231" current_user_pass = "Antonqwe" # 要更新的银行卡列表,替换成实际业务传入的银行卡数据即可 updated_cards = ["622202xxxxxx1234567", "621700xxxxxx7654321"] # 加载文件,注意指定允许加载Account类,避免自定义标签被过滤 account_list = YAML.unsafe_load( File.read("file.yml"), permitted_classes: [Account] ) # 精确匹配目标账号 target = account_list.find do |account| account.login == current_user_login && account.password == current_user_pass end # 没匹配到直接抛业务异常即可 raise "账号校验失败,无法更新银行卡信息" if target.nil? # 仅更新card字段 target.card = updated_cards # 全量写回原文件,to_yaml会自动保留!ruby/object:Account的标签格式 File.write("file.yml", account_list.to_yaml)
避坑说明
- Ruby 3.1及以上版本YAML默认是安全加载模式,直接用
YAML.load/YAML.load_file会把自定义对象转成普通Hash,写回的时候会丢失!ruby/object:Account标签,破坏原文件结构,必须指定permitted_classes: [Account]放开Account类的加载权限 - 不要单独把匹配到的账号抽出来修改后单独写入,必须全量加载、全量写回,否则会把文件里其他账号的记录全部覆盖掉
- 字段匹配用全等判断,不要加模糊匹配逻辑,避免误改其他账号的数据
- 执行代码前确保运行上下文已经加载了Account类的定义,否则YAML解析自定义对象时会报错
执行完成后,目标账号的card字段会更新为新值,name、login、password、age等其余字段,以及文件内存储的其他账号对象都不会有任何改动。
内容的提问来源于stack exchange,提问作者Smile
相关产品推荐
相关产品推荐

