gpt4 book ai didi

ruby-on-rails - 在事务脚本中将 ActiveRecord 结果转换为 json

转载 作者:数据小太阳 更新时间:2023-10-29 08:37:50 25 4
gpt4 key购买 nike

我看过很多关于此的帖子,但似乎没有任何解决方案适用于此应用程序。我有一个事务脚本 CreateContact,它在添加到数据库时返回一个成功对象:

class CreateContact < TransactionScript
def run(params)
contact = Contact.create(params)
return success(contact: contact)
end
end

这是我的测试代码:

require 'spec_helper'

describe CreateContact do

it_behaves_like('TransactionScripts')
let(:script) {CreateContact.new}

it "creates a contact" do
contact = CreateContact.run({:name=>'contact1', :email=>'me@email.com', :phoneNum=>'1234567'})
expect(contact.success?).to eq(true)
expect(contact.name).to eq('contact1')
expect(contact.email).to eq('me@email.com')
expect(contact.phoneNum).to eq('1234567')
end
end

我尝试了几种解析为散列或 JSON 的方法:在 Contact.create 中拆分参数散列,将“.to_json”和“JSON.parse”添加到成功对象值,在整个成功时调用两者对象,并调用 '.to_a.map(&:serializable_hash)'。我还尝试过在“.property”、“[:key]”和“['property']”格式之间转换测试代码属性。 '['property']' 是唯一一个似乎返回任何东西的方法,但它只返回“属性”(而不是值)。

当运行测试时,我实际上可以看到 ActiveRecord 对象已成功创建,如果我在 binding.pry 中调用其中一些技术,它们将被解析,但是当我尝试在代码中实现它们时,测试仍然出现零值。谁能看出我做错了什么?

最佳答案

要将 ActiveRecord 对象转换为类似 JSON 的哈希,您可以使用 Active Model JSON Serializer 中的 as_json 方法:

hash = contact.as_json
#=> {"id"=>1, "name"=>"contact1", ...}

然后您可以使用 hash["attribute"] 访问散列的内容。但是,您不能调用hash[:attribute]hash.attribute:

hash["name"]   #=> "contact1"
hash[:name] #=> nil
hash.name #=> NoMethodError: undefined method `name' for {}:Hash

如果您想将该行为添加到散列中,您可以构建一个 OpenStruct来自哈希:

hash2 = OpenStruct.new(contact.as_json)

hash2["name"] #=> "contact1"
hash2[:name] #=> "contact1"
hash.name #=> "contact1"

如果您只需要将 JSON 作为实际的 String,请使用 to_json:

json = contact.to_json
#=> "{\"id\":1,\"name\":\"contact1\",...}"

关于ruby-on-rails - 在事务脚本中将 ActiveRecord 结果转换为 json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25074631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com