How can I access value in deeply nested hash in Ruby? - ruby-on-rails

Could someone help me to access "value" in this deeply nested hash:
hash = {
"data" => {},
"content" => [
{
"data" => {},
"content" => [
{
"data" => {},
"marks" => [],
"value" => "est ce que j'arrive à te choper",
"nodeType" => "text"
}
],
"nodeType" => "paragraph"
}
],
"nodeType" => "document"
}

You can get value with dig
hash.dig('content', 0, 'content', 0, 'value')
#=> "est ce que j'arrive à te choper"

Related

How to post nested JSON to HTTParty in Ruby on Rails

I am trying to work out the correct way to post a nested JSON object to an API using HTTParty.
I am getting a successful response using Postman to test the call:
POST: http://service.net/api
Headers: x-api-key : apikey123
Body :
{
"VehicleRequests": [{
"Id": "Vehicle1",
"Parameters": {
"Term": 60,
"CashDeposit": 10,
"DepositType": "Percentage",
"AnnualMileage": 10000
},
"PhysicalVehicle": {
"ExternalVehicleId": "12345",
"Type": "Car",
"Status": "PreOwned",
"OnTheRoadPrice": "30000",
"Mileage": "12345",
"Registration": {
"RegistrationNumber": "REGN0",
"DateRegisteredWithDvla": "01/01/2018"
}
}
}]
}
This returns:
{
"Vehicles": [
{
"Id": "Vehicle1",
"HasError": false,
"Error": null,
"FinanceQuotations": [
{
"HasError": false,
"Error": null,
"Finance": {
"Key": "HP",
"Notifications": [],
"Quote": {
.....
}
}
}
}
]
}
But i'm struggling to replicate the call from my rails app. I have a class set up which i'm calling on create
class Monthlyprice
def initialize()
#response = HTTParty.post('http://service.net/api',
:body =>{
:VehicleRequests=> [{
:Id => "Vehicle1",
:Parameters => {
:Term => 60,
:CashDeposit => 10,
:DepositType => "Percentage",
:AnnualMileage => 10000
},
:PhysicalVehicle => {
:ExternalVehicleId => "12345",
:Type => "Car",
:Status => "PreOwned",
:OnTheRoadPrice => "30000",
:Mileage => "12345",
:Registration => {
:RegistrationNumber => "REGN0",
:DateRegisteredWithDvla => "01/01/2018"
}
}
}].to_json
},
:headers => {"x-api-key" => "apikey123"})
puts(#response)
end
end
But this is returning the following error message from the API:
{"Error"=>{"UserMessage"=>"Request is invalid.", "TechnicalMessage"=>"Request Validation failed. Request had 2 error(s). 1: request.VehicleRequests[0].Id - The Id field is required.\r\n2: request.VehicleRequests[0].Parameters - The Parameters field is required.", "Code"=>"80000"}}
This is the same error that I get from the api in postman if I remove the Id and Parameters objects which suggests the contents of my VehicleRequests object is formatted incorrectly? Any advice would be great!
Can you please change the syntax like below :-
:body => {
}.to_json
that means you have to use .to_json where the body parenthesis close I think it's only syntax error.
Syntax :-
response = HTTParty.post("your request URL",
headers: {
.....
#your header content
.....
},
body: {
......
#your body content
.....
}.to_json
)
I have just edited in your code please try below code :-
#response = HTTParty.post('http://service.net/api',
:headers => {"x-api-key" => "apikey123"},
:body =>{
:VehicleRequests=> [{
:Id => "Vehicle1",
:Parameters => {
:Term => 60,
:CashDeposit => 10,
:DepositType => "Percentage",
:AnnualMileage => 10000
},
:PhysicalVehicle => {
:ExternalVehicleId => "12345",
:Type => "Car",
:Status => "PreOwned",
:OnTheRoadPrice => "30000",
:Mileage => "12345",
:Registration => {
:RegistrationNumber => "REGN0",
:DateRegisteredWithDvla => "01/01/2018"
}
}
}]
}.to_json
)
Hope this will help you :)

How to transform an object into an array from REST POST output

I am building an Rails 5 app.
In this app I create a user with customfields. The output I get from the client (Javascript) is a bit wrong (and I have no idea how to change that). How can I "transform" the output I get into the output I must have?
The below is what I get
"user_customfields_attributes" => {
"1533038627616" => {
"customfield_id" => "1", "value" => "test 1"
}, "1533038627617" => {
"customfield_id" => "2", "value" => "test 2"
}
}
The below is what I need
"user_customfields_attributes" => [{
"customfield_id" => 1,
"value" => "test 1"
}, {
"customfield_id" => 2,
"value" => "test 2"
}]
Thankful for all help!

Failed to parse date field [0] with format [MMM, YY] with elastic search 5.0

I am trying to get the date parsed into a string format as month and numerical year format like "JAN, 92". My mapping is as below:
size" => 0,
"query" => {
"bool" => {
"must" => [
{
"term" => {
"checkin_progress_for" => {
"value" => "Goal"
}
}
},
{
"term" => {
"goal_owner_id" => {
"value" => "#{current_user.access_key}"
}
}
}
]
}
},
"aggregations" => {
"chekins_over_time" => {
"range" => {
"field" => "checkin_at",
"format" => "MMM, YY",
"ranges" => [
{
"from" => "now-6M",
"to" => "now"
}
]
},
"aggs" => {
"checkins_monthly" => {
"date_histogram" => {
"field" => "checkin_at",
"format" => "MMM, YY",
"interval" => "month",
"min_doc_count" => 0,
"missing" => 0,
"extended_bounds" => {
"min" => "now-6M",
"max" => "now"
}
}
}
}
}
}
}
I throws the following error:
elasticsearch.transport.RemoteTransportException: [captia-america][127.0.0.1:9300][indices:data/read/search[phase/query]]
Caused by: elasticsearch.ElasticsearchParseException: failed to parse date field [0] with format [MMM, YY]
If I remove the {MMM, YY} and put the normal date format it works.
What could the solution to rectify this.Help appreciated.
Your checkins_monthly aggregation is a bit wrong. The missing part should have the same format for the date to use when the field is missing. A 0 is not actually a date.
For example:
"aggs": {
"checkins_monthly": {
"date_histogram": {
"field": "checkin_at",
"format": "MMM, YY",
"interval": "month",
"min_doc_count": 0,
"missing": "Jan, 17",
"extended_bounds": {
"min": "now-6M",
"max": "now"
}
}
}

What does X-Apple-Store-Front means in apple http headers?

I need get hot search keywords using apple API https://search.itunes.apple.com/WebObjects/MZSearchHints.woa/wa/trends, and set values {"X-Apple-Store-Front": "143465-19,30"} in http
headers, if i set "X-Apple-Store-Front" to "143465-19,30", the result is
{
"header": {
"label": "热门搜索"
},
"trendingSearches": [
{
"label": "蜜芽",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E8%9C%9C%E8%8A%BD"
},
{
"label": "qq",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=qq"
},
{
"label": "腾讯视频",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E8%85%BE%E8%AE%AF%E8%A7%86%E9%A2%91"
},
{
"label": "微信",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E5%BE%AE%E4%BF%A1"
},
{
"label": "爱奇艺",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E7%88%B1%E5%A5%87%E8%89%BA"
},
{
"label": "淘宝",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E6%B7%98%E5%AE%9D"
},
{
"label": "百度",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E7%99%BE%E5%BA%A6"
},
{
"label": "qq音乐",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=qq%E9%9F%B3%E4%B9%90"
},
{
"label": "微博",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E5%BE%AE%E5%8D%9A"
},
{
"label": "百度网盘",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=Software&src=trending&term=%E7%99%BE%E5%BA%A6%E7%BD%91%E7%9B%98"
}
]
}
if i set "X-Apple-Store-Front" to "143465-19,29", the result will change.
{
"header": {
"label": "热门搜索"
},
"trendingSearches": [
{
"label": "铃声",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E9%93%83%E5%A3%B0"
},
{
"label": "李荣浩",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E6%9D%8E%E8%8D%A3%E6%B5%A9"
},
{
"label": "泰勒·斯威夫特",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E6%B3%B0%E5%8B%92%C2%B7%E6%96%AF%E5%A8%81%E5%A4%AB%E7%89%B9"
},
{
"label": "像我这样的人",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E5%83%8F%E6%88%91%E8%BF%99%E6%A0%B7%E7%9A%84%E4%BA%BA"
},
{
"label": "eminem",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=eminem"
},
{
"label": "杨宗纬",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E6%9D%A8%E5%AE%97%E7%BA%AC"
},
{
"label": "张碧晨",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E5%BC%A0%E7%A2%A7%E6%99%A8"
},
{
"label": "刘若英",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E5%88%98%E8%8B%A5%E8%8B%B1"
},
{
"label": "lady gaga",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=lady%20gaga"
},
{
"label": "赵雷",
"url": "https://search.itunes.apple.com/WebObjects/MZStore.woa/wa/search?clientApplication=MusicPlayer&src=trending&term=%E8%B5%B5%E9%9B%B7"
}
]
}
, pls tell me what does mean and how to use X-Apple-Store-Front, and the X-Apple-Store-Front mapping?
THis X-Apple-Store-Front is a country code. For more info:
https://affiliate.itunes.apple.com/resources/documentation/linking-to-the-itunes-music-store/
143465-19,29 means CN store, zh-cn language, P84 platform
It's ${storefrontID}-${languageVariationID},${platformID}. More info here. Language variations are explained a bit here. Basically, if you leave off the -${languageVariationID}, you'll get a decent default for storefront's country.
If you want a non-default language, the language-variations are here:
{
'pt-br': 15,
'it-it': 7,
'hi-in': 50,
'ca-es': 42,
'es-es': 8,
'zh-tw': 18,
'th-th': 35,
'da-dk': 11,
'fi-fi': 12,
'en-gb': 2,
'nl-nl': 10,
'pl-pl': 20,
'ro-ro': 39,
'zh-cn': 19,
'no-no': 14,
'pt-pt': 24,
'de-ch': 57,
'uk-ua': 29,
'en-us': 1,
'vi-vi': 43,
'sv-se': 17,
'en-ca': 6,
'fr-fr': 3,
'sk-sk': 40,
'zh-hk': 45,
'hr-hr': 41,
'en-au': 27,
'ko-kr': 13,
'tr-tr': 25,
'el-gr': 23,
'ms-my': 38,
'id-id': 37,
'cs-cz': 22,
'hu-hu': 21,
'fr-ca': 5,
'es-mx': 28,
'de-de': 4,
'ru-ru': 16,
'ja-jp': 9
}
The platform-ids available are these:
{
K7: 20,
P7: 21,
K71: 23,
P71: 24,
K8: 25,
P8: 26,
P84: 29,
K84: 30,
Android: 31,
Watch: 35,
MacPodcasts1: 38
}
And the store-ids are here:
{
DZ: 143563,
AO: 143564,
AI: 143538,
AR: 143505,
AM: 143524,
AU: 143460,
AT: 143445,
AZ: 143568,
BH: 143559,
BB: 143541,
BY: 143565,
BE: 143446,
BZ: 143555,
BM: 143542,
BO: 143556,
BW: 143525,
BR: 143503,
VG: 143543,
BN: 143560,
BG: 143526,
CA: 143455,
KY: 143544,
CL: 143483,
CN: 143465,
CO: 143501,
CR: 143495,
HR: 143494,
CY: 143557,
CZ: 143489,
DK: 143458,
DM: 143545,
EC: 143509,
EG: 143516,
SV: 143506,
EE: 143518,
FI: 143447,
FR: 143442,
DE: 143443,
GH: 143573,
GR: 143448,
GD: 143546,
GT: 143504,
GY: 143553,
HN: 143510,
HK: 143463,
HU: 143482,
IS: 143558,
IN: 143467,
ID: 143476,
IE: 143449,
IL: 143491,
IT: 143450,
JM: 143511,
JP: 143462,
JO: 143528,
KE: 143529,
KW: 143493,
LV: 143519,
LB: 143497,
LT: 143520,
LU: 143451,
MO: 143515,
MK: 143530,
MG: 143531,
MY: 143473,
ML: 143532,
MT: 143521,
MU: 143533,
MX: 143468,
MS: 143547,
NP: 143484,
NL: 143452,
NZ: 143461,
NI: 143512,
NE: 143534,
NG: 143561,
NO: 143457,
OM: 143562,
PK: 143477,
PA: 143485,
PY: 143513,
PE: 143507,
PH: 143474,
PL: 143478,
PT: 143453,
QA: 143498,
RO: 143487,
RU: 143469,
SA: 143479,
SN: 143535,
SG: 143464,
SK: 143496,
SI: 143499,
ZA: 143472,
ES: 143454,
LK: 143486,
SR: 143554,
SE: 143456,
CH: 143459,
TW: 143470,
TZ: 143572,
TH: 143475,
TN: 143536,
TR: 143480,
UG: 143537,
UA: 143492,
AE: 143481,
US: 143441,
UY: 143514,
UZ: 143566,
VE: 143502,
VN: 143471,
YE: 143571
}
A (small) update on this one:
X-Apple-Store-Front work with ID's in this order:
<country>-<language*>,<platform>
Where language is optional. Default is EN-US.
Example: 143452-10,9 (-Dutch,Apps)
Here's an updated list of country codes:
'AE' => '143481',
'AF' => '143610',
'AG' => '143540',
'AI' => '143538',
'AL' => '143575',
'AM' => '143524',
'AO' => '143564',
'AR' => '143505',
'AT' => '143445',
'AU' => '143460',
'AZ' => '143568',
'BA' => '143612',
'BB' => '143541',
'BD' => '143490',
'BE' => '143446',
'BF' => '143578',
'BG' => '143526',
'BH' => '143559',
'BJ' => '143576',
'BM' => '143542',
'BN' => '143560',
'BO' => '143556',
'BR' => '143503',
'BS' => '143539',
'BT' => '143577',
'BW' => '143525',
'BY' => '143565',
'BZ' => '143555',
'CA' => '143455',
'CD' => '143613',
'CG' => '143582',
'CH' => '143459',
'CI' => '143527',
'CL' => '143483',
'CM' => '143574',
'CN' => '143465',
'CO' => '143501',
'CR' => '143495',
'CV' => '143580',
'CY' => '143557',
'CZ' => '143489',
'DE' => '143443',
'DK' => '143458',
'DM' => '143545',
'DO' => '143508',
'DZ' => '143563',
'EC' => '143509',
'EE' => '143518',
'EG' => '143516',
'ES' => '143454',
'FI' => '143447',
'FJ' => '143583',
'FM' => '143591',
'FR' => '143442',
'GA' => '143614',
'GB' => '143444',
'GD' => '143546',
'GF' => '143615',
'GH' => '143573',
'GM' => '143584',
'GR' => '143448',
'GT' => '143504',
'GW' => '143585',
'GY' => '143553',
'HK' => '143463',
'HN' => '143510',
'HR' => '143494',
'HU' => '143482',
'ID' => '143476',
'IE' => '143449',
'IL' => '143491',
'IN' => '143467',
'IQ' => '143617',
'IS' => '143558',
'IT' => '143450',
'JM' => '143511',
'JO' => '143528',
'JP' => '143462',
'KE' => '143529',
'KG' => '143586',
'KH' => '143579',
'KN' => '143548',
'KP' => '143466',
'KR' => '143466',
'KW' => '143493',
'KY' => '143544',
'KZ' => '143517',
'LA' => '143587',
'LB' => '143497',
'LC' => '143549',
'LI' => '143522',
'LK' => '143486',
'LR' => '143588',
'LT' => '143520',
'LU' => '143451',
'LV' => '143519',
'LY' => '143567',
'MA' => '143620',
'MD' => '143523',
'ME' => '143619',
'MG' => '143531',
'MK' => '143530',
'ML' => '143532',
'MM' => '143570',
'MN' => '143592',
'MO' => '143515',
'MR' => '143590',
'MS' => '143547',
'MT' => '143521',
'MU' => '143533',
'MV' => '143488',
'MW' => '143589',
'MX' => '143468',
'MY' => '143473',
'MZ' => '143593',
'NA' => '143594',
'NE' => '143534',
'NG' => '143561',
'NI' => '143512',
'NL' => '143452',
'NO' => '143457',
'NP' => '143484',
'NR' => '143606',
'NZ' => '143461',
'OM' => '143562',
'PA' => '143485',
'PE' => '143507',
'PG' => '143597',
'PH' => '143474',
'PK' => '143477',
'PL' => '143478',
'PT' => '143453',
'PW' => '143595',
'PY' => '143513',
'QA' => '143498',
'RO' => '143487',
'RS' => '143500',
'RU' => '143469',
'RW' => '143621',
'SA' => '143479',
'SB' => '143601',
'SC' => '143599',
'SE' => '143456',
'SG' => '143464',
'SI' => '143499',
'SK' => '143496',
'SL' => '143600',
'SN' => '143535',
'SR' => '143554',
'ST' => '143598',
'SV' => '143506',
'SZ' => '143602',
'TC' => '143552',
'TD' => '143581',
'TH' => '143475',
'TJ' => '143603',
'TM' => '143604',
'TN' => '143536',
'TO' => '143608',
'TR' => '143480',
'TT' => '143551',
'TW' => '143470',
'TZ' => '143572',
'UA' => '143492',
'UG' => '143537',
'US' => '143441',
'UY' => '143514',
'UZ' => '143566',
'VC' => '143550',
'VE' => '143502',
'VG' => '143543',
'VN' => '143471',
'VU' => '143609',
'XK' => '143624',
'YE' => '143571',
'ZA' => '143472',
'ZM' => '143622',
'ZW' => '143605'
I haven't found a 'platform' list (yet).

Google Analytics Referral - Ruby

I am using ruby, and attempting to get referrals from google analytics api. Here is what I have set up:
sa_referral = client.execute(:api_method => analytics.data.ga.get, :parameters => {
'ids' => "ga:" + saprofileID,
'dimensions' => "ga:fullreferrer",
'metrics' => "ga:users",
'sort' => "-ga:users",
'filters' => "ga:source!=(direct);",
'start-date' => startDate,
'end-date' => endDate,
})
sa_referral_data = sa_referral do |row|
row = {
:referral => row['0'],
:members => row['1'],
}
end
send_event('sa_top_referrals', current: sa_referral_data)
This returns no data when called in the widget using sa_top_referrals. Below is the data the API is returning.
"columnHeaders": [
{
"name": "ga:fullreferrer",
"columnType": "DIMENSION",
"dataType": "STRING"
},
{
"name": "ga:users",
"columnType": "METRIC",
"dataType": "INTEGER"
}
],
"totalsForAllResults": {
"ga:users": "35638"
},
"rows": [
[
"m.facebook.com/",
"1009"
],
[
"baidu",
"912"
],
[
"usasexguide.info/forum/showthread.php",
"613"
],
Ideally the information I am looking to pull down is the URL ex: m.facebook.com/ and the user count or "613". Those are the two items I am looking to pull. My question is how do I know what row those are equal to. Above i'm sending it using: :referral => row['0'], I'd assume the issue is that its not actually row 0, is there a way I can confirm this?
This should do it:
sa_referral_data = sa_referral['rows'] do |row|
rows.map{|r| { referrals:r[0], members:r[1] }}
end

Resources