F4Ke
F4Ke

Reputation: 1751

Rails - Get all keys from params hash

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

Answers (3)

Pavel Tkackenko
Pavel Tkackenko

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

knut
knut

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

Aleksey Shein
Aleksey Shein

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

Related Questions