0

Is there a way to traverse over parameters in rails? I have a nested params:

"request"=>{"name"=>"Gianni Hayes",
   "address"=>"5858 Bernhard Burgs",
   "phone"=>"(972) 399-9601",
   "mobile"=>"777 777 01 02",
   "filled_cartridges_attributes"=>{
      "0"=>{
         "cartridge_id"=>"HP laserjet 300",
         "_destroy"=>"false"}
          },
 "description"=>"sakld",
 "responsible"=>"15",

There might be many "filled_cartridges_attributes, so i need to iterate through them in controller.

yerassyl
  • 2,622
  • 3
  • 29
  • 56
  • 1
    the params object is basically just a (nested) hash, you can iterate over the elements like you would a normal hash. `hsh.each` etc. – Slicedpan Apr 17 '15 at 10:52

3 Answers3

0

As params is basically a Hash. You can use Hash#each:

params = "request"=>{"name"=>"Gianni Hayes",
   "address"=>"5858 Bernhard Burgs",
   "phone"=>"(972) 399-9601",
   "mobile"=>"777 777 01 02",
   "filled_cartridges_attributes"=>{
      "0"=>{
         "cartridge_id"=>"HP laserjet 300",
         "_destroy"=>"false"}
          },
 "description"=>"sakld",
 "responsible"=>"15"}
}
params["request"].each { |key, value| puts key.to_s + " : " + value.to_s }
# name : Gianni Hayes
# address : 5858 Bernhard Burgs
# phone : (972) 399-9601
# mobile : 777 777 01 02
# filled_cartridges_attributes : {"0"=>{"cartridge_id"=>"HP laserjet 300", "_destroy"=>"false"}}
# description : sakld
# responsible : 15

Or do it recursively as its hash of hashes:

 def deep_traverse(hash)
    hash.each do |key, val|
       puts key
       if val.is_a?(Hash)
         display val
       else
         puts val
       end
    end
 end
 deep_traverse params
 # request
 # Gianni Hayes
 # 5858 Bernhard Burgs
 # (972) 399-9601
 # 777 777 01 02
 # HP laserjet 300
 # false
 # sakld
 # 15
shivam
  • 14,497
  • 1
  • 47
  • 64
0

Simply, just as a hash. If you have following hash:

response = {"request"=>{"name"=>"Gianni Hayes",
                       "address"=>"5858 Bernhard Burgs",
                        "phone"=>"(972) 399-9601",
                        "mobile"=>"777 777 01 02",
                        "filled_cartridges_attributes"=>{
                              "0"=>{
                              "cartridge_id"=>"HP laserjet 300",
                              "_destroy"=>"false"}
                         },
                         "description"=>"sakld",
                         "responsible"=>"15"}
                       }
           }

Now here is the way to access filled_cartridges_attributes:

response["request"]["filled_cartridges_attributes"].each do |_, value|
  puts value["cartridge_id"] # => HP laserjet 300"
  ...
  ...
end
RAJ
  • 9,353
  • 1
  • 29
  • 61
0

params[:request][:filled_cartridges_attributes] will return a hash so you can iterate over it using each ,each_value or each_key like:

params[:request][:filled_cartridges_attributes].each_value {|value| p value}

Anuja Joshi
  • 648
  • 6
  • 13