创建消息对象分析器

时间:2014-03-14 13:21:15

标签: ruby-on-rails ruby object

我正在收到像这样的网络服务的结果:

result.body返回:

[2] pry(#<User::EmailSettingsController>)> result.body
=> {"RESULT"=>
  {"MESSAGES"=>
    [{"MESSAGE"=>
       {"TYPE"=>"E",
        "ID"=>"HRRCF_WD_UI",
        "NUMBER"=>"025",
        "MESSAGE"=>"U kunt maximaal \"5\" jobagents creëren 1",
        "LOG_NO"=>"",
        "LOG_MSG_NO"=>"000000",
        "MESSAGE_V1"=>"5",
        "MESSAGE_V2"=>"1",
        "MESSAGE_V3"=>"",
        "MESSAGE_V4"=>"",
        "PARAMETER"=>"",
        "ROW"=>"0",
        "FIELD"=>"",
        "SYSTEM"=>""}},
     {"MESSAGE"=>
       {"TYPE"=>"E",
        "ID"=>"HRRCF_WD_UI",
        "NUMBER"=>"025",
        "MESSAGE"=>"U kunt maximaal \"5\" jobagents creëren 2",
        "LOG_NO"=>"",
        "LOG_MSG_NO"=>"000000",
        "MESSAGE_V1"=>"5",
        "MESSAGE_V2"=>"2",
        "MESSAGE_V3"=>"",
        "MESSAGE_V4"=>"",
        "PARAMETER"=>"",
        "ROW"=>"0",
        "FIELD"=>"",
        "SYSTEM"=>""}},
     {"MESSAGE"=>
       {"TYPE"=>"E",
        "ID"=>"HRRCF_WD_UI",
        "NUMBER"=>"025",
        "MESSAGE"=>"U kunt maximaal \"5\" jobagents creëren 3",
        "LOG_NO"=>"",
        "LOG_MSG_NO"=>"000000",
        "MESSAGE_V1"=>"5",
        "MESSAGE_V2"=>"3",
        "MESSAGE_V3"=>"",
        "MESSAGE_V4"=>"",
        "PARAMETER"=>"",
        "ROW"=>"0",
        "FIELD"=>"",
        "SYSTEM"=>""}}]}}

是否有可能创建一些ParseMessageObject(result.body),它返回我可以做这样的事情。

message_list = ParseMessageObject(result.body)
message_list.each do |message|
 puts message.message
 puts message.type
end

我不知道这是否可行或如何做到这一点任何建议让我开始欢迎!

编辑1: 在lib中创建我的类:

class MessageParser
    def self.parse(result)

    end 
end

2 个答案:

答案 0 :(得分:1)

这应该基本上做你想要的,使用一个简单的开放结构来创建一个消息类,它具有消息散列中每个键的访问器

require 'ostruct'

class MessageParser
  Message = Struct.new(:type, :id, :number, :message, :log_no, :log_msg_no, :message_v1, :message_v2, :message_v3, :message_v4, :parameter, :row, :field, :system)

  attr_reader :messages
  def initialize(data)
    @data = data.fetch("MESSAGES",[])
    @messages = []
    parse_data
  end

  private
  def parse_data
    @data.each do | msg |
      message = Message.new
      msg.fetch("MESSAGE",{}).each do |key, value|
        message[key.downcase.to_sym] = value
      end
      @messages << message
    end
  end
end

parser = MessageParser.new(result.body["RESULT"])
parser.messages.each do |message|
  puts message.message
  puts message.type
end

答案 1 :(得分:0)

这样的事情应该有效:

class ParsedMessages
  include Enumerable
  attr_reader :messages

  def initialize(data)
    @messages = extract_messages_from_data(data)
  end

  def extract_messages_from_data(data)
    # TODO: Parse data and return message objects
  end

  def each &block  
    @messages.each do |message|
      if block_given?
        block.call message
      else  
        yield message
      end
    end  
  end

end

现在,您可以使用ParsedMessages each上的所有方法,例如findmap,{{1}}等等。