adding key/value pairs to hash wrongfully adds a right bracket

Hey all,

THis line of code gets called multiple times and creates a hash:

  def session_code(unit_id, code)

    s_code = session[:code]     unit_id_hash = s_code.detect {|h| h[unit_id]}

    if unit_id_hash.nil?       unit_id_hash = {}       s_code << {unit_id => unit_id_hash}     end

    key = case code       when 3,4         :code_a       when 8,9         :code_b       end

    unit_id_hash[key] ||=     unit_id_hash[key] << code if key   end

But the result looks like this:

[{"1113"=>{:code_a=>[8]}, :code_b=>[4]}]

There is an extra "}" in that hash after [8]. THat's strange why that happens.

The result should look like this:

[{'1113' => {:code_a => [8], :code_b => [4]}}]

Because of the problem I cannot grab the second hash value:

session[:code].detect {|hash| hash["1113"] }["1113"][:code_b]

thanks for response

How do you call the session_code method?

What data type are unit_id and code? And what does a typical session[:code] look like?

The two branches of this code result in unit_id_hash looking somewhat different .

In the case where you find something in s_code, what you're setting unit_id_hash to is something of the form {unit_id => {...}} whereas I expect you're expect it to be the value from that hash for the key unit_id

Fred

thanks for response. I see what you are trying to say, but this line right here:

s_code << {unit_id => unit_id_hash}

it just creates a hash like this: {unit_id => {}}

and then latter we insert items into it, always the same way, whether it's the first time we insert item or not:

unit_id_hash[key] << code if key

So if you see a problem here, maybe I am not understanding.

thanks for response

Open a rails console and enter code that illustrates the problem. Then copy/paste that here. If it seems to work in the console then the contents of your variables may not be what you expect. Use ruby-debug to break into the code, then you can inspect the data and follow the flow to see what is going wrong. Have a look at the Rails Guide on debugging to see how to use ruby-debug if necessary.

Colin

Before I try to figure it out further, something smells.

You pass in an arg called "code", and often refer to ":code". This sort of "shadowing" is Very Confusing. If they are supposed to be the same thing, you've got some colons to remove (or maybe add and an arg to dump), else you've got an arg to rename.

-Dave

thanks for response, code was an integer, and :code was just a key of the session hash. But I decided in end to make this database backed.