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}

    key = case code
      when 3,4
      when 8,9

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

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

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


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.


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.


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.