Oh, I see -- the "extra" quotes and backslashes are the output of inspect. Note the difference in irb:
2.0.0-p247 :011 > TECHS.inspect
=> "{\"platform\"=>[{\"AssignedName\"=>\"P1\", \"ExportPrice\"=>\"USD\", \"Id\"=>\"1\", \"Delivery\"=>\"Y\", \"RegisteredMembers\"=>[{\"Name\"=>\"Admin\", \"Id\"=>\"3\", \"AvailablePosts\"=>[{\"Seat\"=>\"2\", \"Colour\"=>18}, {\"Seat\"=>\"3\", \"Colour\"=>19}, {\"Seat\"=>\"4\", \"Colour\"=>181}, {\"Seat\"=>\"5\", \"Colour\"=>183}]}]}]}"
2.0.0-p247 :012 > TECHS
=> {"platform"=>[{"AssignedName"=>"P1", "ExportPrice"=>"USD", "Id"=>"1", "Delivery"=>"Y", "RegisteredMembers"=>[{"Name"=>"Admin", "Id"=>"3", "AvailablePosts"=>[{"Seat"=>"2", "Colour"=>18}, {"Seat"=>"3", "Colour"=>19}, {"Seat"=>"4", "Colour"=>181}, {"Seat"=>"5", "Colour"=>183}]}]}]}
2.0.0-p247 :013 >
The second one is the actual value of TECHS.
Let's take another stab at this.
TECHS is a hash with only one key: 'platform':
2.0.0-p247 :019 > TECHS.class
=> Hash
2.0.0-p247 :020 > TECHS.keys
=> ["platform"]
which contains an array of 1 item:
2.0.0-p247 :021 > TECHS['platform']
=> [{"AssignedName"=>"P1", "ExportPrice"=>"USD", "Id"=>"1", "Delivery"=>"Y", "RegisteredMembers"=>[{"Name"=>"Admin", "Id"=>"3", "AvailablePosts"=>[{"Seat"=>"2", "Colour"=>18}, {"Seat"=>"3", "Colour"=>19}, {"Seat"=>"4", "Colour"=>181}, {"Seat"=>"5", "Colour"=>183}]}]}]
2.0.0-p247 :022 > TECHS['platform'].class
=> Array
2.0.0-p247 :023 > TECHS['platform'].count
=> 1
That one item is the thing you actually want to convert to pass to you model, yes? So without all the hoopla, try:
2.0.0-p247 :027 > params = Hash[TECHS['platform'].first.map{|k,v| [ActiveSupport::Inflector.underscore(k.to_s),v]}]
=> {"assigned_name"=>"P1", "export_price"=>"USD", "id"=>"1", "delivery"=>"Y", "registered_members"=>[{"Name"=>"Admin", "Id"=>"3", "AvailablePosts"=>[{"Seat"=>"2", "Colour"=>18}, {"Seat"=>"3", "Colour"=>19}, {"Seat"=>"4", "Colour"=>181}, {"Seat"=>"5", "Colour"=>183}]}]}
I'm not sure what you want to be doing with the registered_members value, and the AvailablePosts key underneath that. Are these nested parameters for going in other tables with relationships? If so, you'll need to run those through the same method above. It would probably be very worthwhile to make that an actual method, that could be called recursively if v is something you want to work on (Hash, Array, Object).
···
On Jul 21, 2013, at 12:21 AM, Serguei Cambour <lists@ruby-forum.com> wrote:
tamouse m. wrote in post #1116149:
On Jul 20, 2013, at 2:51 PM, Serguei Cambour <lists@ruby-forum.com> >> wrote:
{"Seat"=>"2", "Colour"=>18, },
TECHS.each_value do |value|
\"available_posts\"=>[{\"seat\"=>\"2\", \"colour\"=>18},
{\"seat\"=>\"3\", \"colour\"=>19}, {\"seat\"=>\"4\", \"colour\"=>181},
{\"seat\"=>\"5\", \"colour\"=>183}]}]}", nil]]
Why are there some extra quotes and nil in the very end ? Thkx
--
Posted via http://www.ruby-forum.com/\.
Not 100% sure what you're seeing as extra quotes, but the nil is what
you get from declaring two passed in values from the map method -- it
only passes in the current value of the array that your original
TECH['platform'] is pointing at, so k is current value, v is always nil.
2.0.0-p247 :008 > [1, 2, 3, 4].map{|k,v| [k,v]}
=> [[1, nil], [2, nil], [3, nil], [4, nil]]
Even if your array elements are hashes, there's still only one value
passed in from map:
2.0.0-p247 :009 > [{a: 1, b: 2, c: 3}, {aa: 11, bb: 22, cc:
33}].map{|k,v| [k,v]}
=> [[{:a=>1, :b=>2, :c=>3}, nil], [{:aa=>11, :bb=>22, :cc=>33}, nil]]
Thanks a lot for the reply. My hash has one value - an array of nested
hashes, that's why I looped on that array and tried to format the keys
with 'underscore' method. I hoped to get them formatted with
'underscore' as follows:
ARR: [[{"assigned_name"=>"p1", "export_price"=>"usd"... etc.
but got all of them prefixed with a backslash, just before every quote:
"{\"assigned_name\"=>\"p1\"
I'd like to pass that hash to update an ActiveRecord value with
update_attributes and it will fails with the above hashes. Any idea?
Thank you.