user3385136
user3385136

Reputation: 553

How do i get the nested hash within this hash

I am having real difficulty referencing messages within this hash.

[
  {
    "MessageThreadID": 1,
    "CustomerID": 171,
    "MessageType": 1,
    "Subject": "Test Message",
    "OpenDate": "2015-09-17T00:00:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 1,
        "MessageThreadID": 1,
        "MessageText": "Test Message",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-17T17:23:00"
      },
      {
        "IBMessageID": 2,
        "MessageThreadID": 1,
        "MessageText": "Test this Update",
        "FromCustomer": false,
        "UserID": 1,
        "Date": "2015-09-17T17:23:00"
      },
      {
        "IBMessageID": 3,
        "MessageThreadID": 1,
        "MessageText": "My New Message",
        "FromCustomer": false,
        "UserID": 1,
        "Date": "2015-09-17T17:23:00"
      },
      {
        "IBMessageID": 4,
        "MessageThreadID": 1,
        "MessageText": "Reply",
        "FromCustomer": false,
        "UserID": 1,
        "Date": "2015-09-17T17:05:00"
      },
      {
        "IBMessageID": 5,
        "MessageThreadID": 1,
        "MessageText": "Some sensible shit",
        "FromCustomer": false,
        "UserID": 1,
        "Date": "2015-09-17T17:23:00"
      },
      {
        "IBMessageID": 14,
        "MessageThreadID": 1,
        "MessageText": "Message 2",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-21T14:10:00"
      },
      {
        "IBMessageID": 16,
        "MessageThreadID": 1,
        "MessageText": "Message 2",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T16:22:00"
      },
      {
        "IBMessageID": 25,
        "MessageThreadID": 1,
        "MessageText": "Added via abacus\r\n",
        "FromCustomer": false,
        "UserID": 1,
        "Date": "2015-09-22T16:22:00"
      },
      {
        "IBMessageID": 26,
        "MessageThreadID": 1,
        "MessageText": "sdsdsdsd",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T16:40:00"
      },
      {
        "IBMessageID": 27,
        "MessageThreadID": 1,
        "MessageText": "test",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T17:02:00"
      },
      {
        "IBMessageID": 28,
        "MessageThreadID": 1,
        "MessageText": "test",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T17:06:00"
      }
    ]
  },
  {
    "MessageThreadID": 5,
    "CustomerID": 171,
    "MessageType": 1,
    "Subject": "Unit Test Thread",
    "OpenDate": "2015-09-21T13:11:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 12,
        "MessageThreadID": 5,
        "MessageText": "Test Message",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-21T13:11:00"
      }
    ]
  },
  {
    "MessageThreadID": 11,
    "CustomerID": 171,
    "MessageType": 0,
    "Subject": "Test5",
    "OpenDate": "2015-09-22T14:39:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 22,
        "MessageThreadID": 11,
        "MessageText": "Test5",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T14:39:00"
      }
    ]
  },
  {
    "MessageThreadID": 13,
    "CustomerID": 171,
    "MessageType": 0,
    "Subject": "Test6",
    "OpenDate": "2015-09-22T14:41:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 24,
        "MessageThreadID": 13,
        "MessageText": "Test6",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T14:41:00"
      }
    ]
  },
  {
    "MessageThreadID": 12,
    "CustomerID": 171,
    "MessageType": 0,
    "Subject": "Test5",
    "OpenDate": "2015-09-22T14:41:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 23,
        "MessageThreadID": 12,
        "MessageText": "Test5",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-22T14:41:00"
      }
    ]
  },
  {
    "MessageThreadID": 14,
    "CustomerID": 171,
    "MessageType": 1,
    "Subject": "Test",
    "OpenDate": "2015-09-23T12:24:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 29,
        "MessageThreadID": 14,
        "MessageText": "Test",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-23T12:24:00"
      }
    ]
  },
  {
    "MessageThreadID": 15,
    "CustomerID": 171,
    "MessageType": 1,
    "Subject": "Accounts Test",
    "OpenDate": "2015-09-23T15:35:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 30,
        "MessageThreadID": 15,
        "MessageText": "Accounts Test",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-23T15:35:00"
      }
    ]
  },
  {
    "MessageThreadID": 16,
    "CustomerID": 171,
    "MessageType": 2,
    "Subject": "Savings ",
    "OpenDate": "2015-09-23T15:36:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 31,
        "MessageThreadID": 16,
        "MessageText": "Savings",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-23T15:36:00"
      }
    ]
  },
  {
    "MessageThreadID": 17,
    "CustomerID": 171,
    "MessageType": 2,
    "Subject": "Savings ",
    "OpenDate": "2015-09-23T15:37:00",
    "Closed": false,
    "ClosedDate": null,
    "Messages": [
      {
        "IBMessageID": 32,
        "MessageThreadID": 17,
        "MessageText": "Savings",
        "FromCustomer": true,
        "UserID": null,
        "Date": "2015-09-23T15:37:00"
      }
    ]
  }
]

My initial call is performed by the following code:

  def open_contact_messages(customer_id)

    customer_id = @customer.id
    response = get_call('/Messages/GetOpenedMessages/' + customer_id.to_s)
    response = JSON.parse(response.body)
    prettyresponse = JSON.pretty_generate(response)

    @openmessages = {}
    @openmessages = response.map do |openmessage|
      Contact.new(openmessage) 
    end

    return @openmessages
  end  

The output shown above is from prettyresponse. In my initializer I have the following code. ibmessages is my attempt at referencing the data within messages but i get a cant convert string into integer error.

class Contact
  attr_accessor :message_customer_ID, :message_type, :message_subject, :message_text, :message_source, :message_thread_ID
  attr_reader :messages

  def initialize(options)

    @message_customer_ID        = options['CustomerID'].to_s 
    @message_type               = options['MessageType'].to_s 
    @message_subject            = options['Subject'].to_s 
    @message_source             = options['Closed'].to_s 
    @message_thread_ID          = options['MessageThreadID'].to_s 
    @messages                   = options['Messages']

  end

end 

In my view I can output the entire hash but referencing the messages hash is proving difficult.

  - open_contact_messages(@customer.id).each do |openmessage|
    .message-container
      %p.message-intro
        Filler said....
      .message
        %h4.message-header.message-contents= "Message Subject : #{openmessage.message_subject}"
        %p.message-body.message-text= "Message Text : #{openmessage.message_text}"
        %p.message-body.message-source= "Message Source : #{openmessage.message_source}"
        %p.message-body.message-thread-ID= "Message Thread ID #{openmessage.message_thread_ID}"
        %p.message-body.message-thread-ID= "Message Test"
        %p.message-body.message-thread-ID
          - openmessage.messages do |message| 
            = message['MessageText']

I am getting a variety of errors based on the many approaches I have found online but no solution. The most common error is cannot convert integer to string.

Upvotes: 0

Views: 73

Answers (1)

Aleksey Shein
Aleksey Shein

Reputation: 7482

What you have here is an array of arrays, i.e. you have a bunch of message threads, each of them contains a bunch of messages.

With this code

@openmessages = response.map do |openmessage|
  Contact.new(openmessage) 
end

you create a Contact instance, and provide it a message thread, i.e. this part:

{
  "MessageThreadID": 1,
  "CustomerID": 171,
  "MessageType": 1,
  "Subject": "Test Message",
  "OpenDate": "2015-09-17T00:00:00",
  "Closed": false,
  "ClosedDate": null,
  "Messages": [ ... ]
}

In your constructor, you may directly assign from options hash only keys listed above, i.e.

@message_customer_ID        = options['CustomerID'].to_s   # ok
@message_type               = options['MessageType'].to_s  # ok
@message_subject            = options['Subject'].to_s      # ok
@message_text               = options['MessageText'].to_s  # not ok
@message_source             = options['Closed'].to_s       # ok
@message_thread_ID          = options['MessageThreadID'].to_s # ok
@messages                   = options['Messages'].to_s     # not ok
@ibmessages                 = options['Messages']['IBMessageID'].to_s # not ok

Messages key contains an array of messages, so you can't just convert them to string, but instead you need to store them as array, so you may process them further.

If you want to output an array of your messages, you need to change @messages assigning to an array, like this:

@messages = options['Messages']

Add a reader method to your Contact class:

class Contact
  attr_reader :messages
end

And after that you can use this reader in your view:

- openmessage.messages do |message|
  = message['MessageText']

Please, note to use - in front of openmessage.messages do |message| line, exactly as in my code above, and not =. The difference between them is that = writes the result to the buffer (i.e. outputs something), while - just runs some ruby code. In this context you don't want to write whole openmessage.messages array in your view in a serialized form, but instead to process it in a loop.

Upvotes: 1

Related Questions