【问题标题】:Converting ActiveRecord results to json in transaction script在事务脚本中将 ActiveRecord 结果转换为 json
【发布时间】:2014-09-24 07:50:26
【问题描述】:

我已经看过很多关于此的帖子,但似乎没有一个解决方案适用于此应用程序。我有一个事务脚本 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 中拆分 params 哈希,将“.to_json”和“JSON.parse”添加到成功对象值中,在整个成功时调用两者对象,并调用 '.to_a.map(&:serializable_hash)'。我还尝试在 '.property'、'[:key]' 和 '['property']' 格式之间转换测试代码属性。 '['property']' 是唯一一个似乎返回任何东西的,但它只返回“property”(而不是一个值)。

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

【问题讨论】:

    标签: ruby-on-rails ruby json activerecord rspec


    【解决方案1】:

    要将 ActiveRecord 对象转换为类似 JSON 的 Hash,您可以使用 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\",...}"
    

    【讨论】:

      猜你喜欢
      • 2018-10-04
      • 1970-01-01
      • 2023-03-25
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多