Sto cercando di creare un gioiello di wrapper API e di avere problemi con la conversione delle chiavi di hash in un formato più Rubyish dal JSON restituito dall'API.Conversione di chiavi hash nidificate da CamelCase a snake_case in Ruby
Il JSON contiene più livelli di nidificazione, sia Hash che Array. Quello che voglio fare è convertire ricorsivamente tutte le chiavi in snake_case per un uso più semplice.
Ecco quello che ho finora:
def convert_hash_keys(value)
return value if (not value.is_a?(Array) and not value.is_a?(Hash))
result = value.inject({}) do |new, (key, value)|
new[to_snake_case(key.to_s).to_sym] = convert_hash_keys(value)
new
end
result
end
Le suddette chiamate questo metodo per convertire le stringhe di snake_case:
def to_snake_case(string)
string.gsub(/::/, '/').
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').
gsub(/([a-z\d])([A-Z])/,'\1_\2').
tr("-", "_").
downcase
end
Idealmente, il risultato sarebbe simile al seguente:
Sto ottenendo la ricorsione sbagliata, e ogni versione di questo tipo di soluzione che ho provato sia non converte i simboli oltre il primo livello, o va in mare e cerca di convertire l'intero hash, inclusi i valori.
Provare a risolvere tutto questo in una classe helper, anziché modificare le funzioni Hash e String effettive, se possibile.
Grazie in anticipo.
Prima di fare qualsiasi altra cosa, "se (non ... e non ...)" è un posto perfetto per usare la legge di De Morgan. Dovresti scriverlo 'a meno che ... o ...'. – sawa