2013-04-10 15 views
2

我想解析這是我從Wufoo項目網絡掛接API收到的哈希值。我這樣做的多種形式,所以我不能像硬編碼值:params['Field5'],因爲我不知道有多少領域都有。如何解析Wufoo形式的webhook散列來獲取表單標籤和值?

>> params.class 
    => Hash 
    >> params 
    => {"FieldStructure"=> 
     "{\"Fields\":[ 
     {\"Title\":\"Company Name\",\"Type\":\"text\",\"ID\":\"Field6\"}, 
     {\"Title\":\"Email\",\"Type\":\"email\",\"ID\":\"Field5\"} 
     ]}", 
"Field6"=>"testse", 
"Field5"=>"[email protected]", 
"CreatedBy"=>"public", 
"DateCreated"=>"2013-04-10 07:38:09", 
"EntryId"=>"21"} 

基本上,我想創建上面的屬性從哈希對象:

company_name: "testse", email: "[email protected]" 
+1

您的輸入哈希非常難看。你可以重新編輯它嗎? – 2013-04-10 20:21:34

+0

當然。完整版在這裏:https://gist.github.com/a1920bf86346e8d24fee – tomekfranek 2013-04-10 20:34:54

回答

1

您可以:

  1. 掃描FieldStructure字符串來確定所需的字段標識。
  2. 然後使用IDS找到params哈希表所需的值

例子:

params = {"FieldStructure"=> 
    "{\"Fields\":[{\"Title\":\"Company Name\",\"Instructions\":\"\",\"IsRequired\":\"0\",\"ClassNames\":\"\",\"DefaultVal\":\"\",\"Page\":\"1\",\"Type\":\"text\",\"ID\":\"Field6\"}, 
    {\"Title\":\"Email\",\"Instructions\":\"\",\"IsRequired\":\"0\",\"ClassNames\":\"\",\"DefaultVal\":\"\",\"Page\":\"1\",\"Type\":\"email\",\"ID\":\"Field5\"}]}", 
"FormStructure"=> 
    "{\"Name\":\"TestForm\",\"Description\":\"This is my form. Please fill it out. It's awesome!\",\"RedirectMessage\":\"Great! Thanks for filling out my form!\",\"Url\":\"testform\",\"Email\":null,\"IsPublic\":\"1\",\"Language\":\"english\",\"StartDate\":\"2000-01-01 12:00:00\",\"EndDate\":\"2030-01-01 12:00:00\",\"EntryLimit\":\"0\",\"DateCreated\":\"2013-04-09 06:44:12\",\"DateUpdated\":\"2013-04-10 05:25:55\",\"Hash\":\"z7x3p3\"}", 
"Field6"=>"testse", 
"Field5"=>"[email protected]", 
"CreatedBy"=>"public", 
"DateCreated"=>"2013-04-10 07:38:09", 
"EntryId"=>"21", 
"IP"=>"46.205.117.55", 
"HandshakeKey"=>""} 

fields = params['FieldStructure'].scan(/Title\":\"(.+?)\".+?ID\":\"(.+?)\"/) 
#=> [["Company Name", "Field6"], ["Email", "Field5"]] 

Hash[fields.collect{ |field| 
    [ 
    field[0].gsub(/\s+/, "_").downcase.to_sym, 
    params[field[1]] 
    ] 
}] 
#=> {:company_name=>"testse", :email=>"[email protected]"} 
+0

賈斯汀你明白爲什麼當我有這個PARAMS在單行掃描場不工作? => https://gist.github.com/regedarek/a1920bf86346e8d24fee – tomekfranek 2013-04-11 11:38:37

+0

爲標題值以及id值之間的文本的檢查是貪婪的,所以你得到的是與電子郵件ID相匹配的公司名稱稱號。它應該是'.scan(/標題\ 「:\」(+)\ 「+ ID \? 」:?\「(+)\。?」/)',它具有在一個額外的''?中間。 – 2013-04-11 13:10:43

+0

好的,非常感謝。 – tomekfranek 2013-04-11 13:21:17