Reputation: 1751
In order to improve my Rails
app security, I want to know how to get all keys from a parametters hash
hash example :
params =
{"id"=>23, "name"=>"test", "infos"=>{"data"=>"er323e3ee23reQir", "signed"=>true}}
if I do params.keys
I obtained : ["id", "name", "infos"]
But I want to get ALL keys, in a simple array, like : ["id", "name", "infos", "data", "signed"]
there is a simple way to do this ?
Upvotes: 6
Views: 7212
Reputation: 953
You can monkey patch Hash class:
class Hash
def all_keys
keys + map { |k, v| v.is_a?(Hash) ? v.all_keys : nil }.flatten.compact
end
end
params = {"id"=>23, "name"=>"test", "infos"=>{"data"=>"er323e3ee23reQir", "signed"=>true}}
params.all_keys # => ["id", "name", "infos", "data", "signed"]
Upvotes: 0
Reputation: 27845
I would use a new method for it:
class Hash
def all_keys
keys = []
each{|k,v|
keys << k
keys << v.all_keys if v.respond_to?(:all_keys)
}
keys.flatten.uniq
end
end
params = {"id"=>23, "name"=>"test", "infos"=>{"data"=>"er323e3ee23reQir", "signed"=>true}}
p params.all_keys
Advantage: You may also define a all_keys-method in Non-Hash-functions.
Upvotes: 0
Reputation: 7482
Try this:
def deep_hash_keys(h)
h.keys + h.map { |_, v| v.is_a?(Hash) ? deep_hash_keys(v) : nil }.flatten.compact
end
params = {"id"=>23, "name"=>"test", "infos"=>{"data"=>"er323e3ee23reQir", "signed"=>true}}
deep_hash_keys(params) # => ["id", "name", "infos", "data", "signed"]
Upvotes: 4