Symbols are puzzling me and not only symbols

Dear all,
I’ve got two burning questions. Both regard the manipulation of the
params hash.
Imagine:
params = {“commit”=>“Add comment”, “comment”=>{“message”=>“foo”,
“name”=>“bar”, “answer”=>“2”, “email”=>“foo@bar”}}

So the params hash has two keys, one(‘commit’) points to a string the
other(‘comment’) to an other hash.
Normally I can do something like; params[:id] or whatever, now if I do
that, params[:commit] it returns nil! Why?? params[‘commit’] works as
expected.

On to the second question, when I have a large array or hash I used
to(In Java/PHP etc) split them up in several lines. For example:
tmp = {:message => ‘tmp’ ,:name => ‘tmp’ ,:email => ‘tmp’}

Would become:
tmp = { :message => ‘tmp’
,:name => ‘tmp’
,:email => ‘tmp’
}

I find this eaasier to read and easier to check for comma related
errors. However Ruby fails to recognise this, failing with the error:
syntax error, unexpected ‘,’, expecting ‘}’
,:name => ‘tmp’
^

Ruby is better kidding me. The interpreter doesn’t handle whitespace??
Any comments on what I am doing wrong or why not ignoring whitespace
is a good idea, I’d love to hear.

With kind regads

ah…
what you experienced before with params[“id”] and params[:id] returned
the same,
was in fact the magic of rails,

and the HashWithIndifferentAccess,
and extension of hash,
which reacts indifferently to symbols vs. strings.

try;
params = HashWithIndifferentAccess.new
params[:id] = “this is the id”

params[“id”] will return “this is the id”
params[:id] will return “this is the id”


alternatively.

params = {:id => “this is the id”, :commit => “this is the
commit”}.with_indifferent_access.


harm wrote:

Dear all,
I’ve got two burning questions. Both regard the manipulation of the
params hash.
Imagine:
params = {“commit”=>“Add comment”, “comment”=>{“message”=>“foo”,
“name”=>“bar”, “answer”=>“2”, “email”=>“foo@bar”}}

So the params hash has two keys, one(‘commit’) points to a string the
other(‘comment’) to an other hash.
Normally I can do something like; params[:id] or whatever, now if I do
that, params[:commit] it returns nil! Why?? params[‘commit’] works as
expected.

Yeah, ruby doesn’t care about spaces, but it does care about new lines.
Which is good, at least it doesn’t rely on semi-colons.

for a multiline declaration with clarity of commas

tmp = {
:message => ‘tmp’ ,
:name => ‘tmp’ ,
:email => ‘tmp’
}

On to the second question, when I have a large array or hash I used
to(In Java/PHP etc) split them up in several lines. For example:
tmp = {:message => ‘tmp’ ,:name => ‘tmp’ ,:email => ‘tmp’}

Would become:
tmp = { :message => ‘tmp’
,:name => ‘tmp’
,:email => ‘tmp’
}

I find this eaasier to read and easier to check for comma related
errors. However Ruby fails to recognise this, failing with the error:
syntax error, unexpected ‘,’, expecting ‘}’
,:name => ‘tmp’

for a multiline declaration with clarity of commas

tmp = {
:message => ‘tmp’ ,
:name => ‘tmp’ ,
:email => ‘tmp’
}

At the very great risk of sounding curmudgeonly, could I put in a
heartfelt plea for people not to do that? It looks bizarre, and seems
to invite scrutiny in case there’s been some kind of mistake or
omission.

To be honest,
the way I like to declare hashes is like this;

tmp = {
:message => “tmp”,
:name => “tmp”,
:email => “tmp”,
}

that’s how I like it.

Hi –

On Sat, 14 Jul 2007, Matthew R. wrote:

Yeah, ruby doesn’t care about spaces, but it does care about new lines.
Which is good, at least it doesn’t rely on semi-colons.

There are some cases where spaces matter; for example:

irb(main):002:0> puts (3) + 2
5
=> nil
irb(main):003:0> puts(3) + 2
3
NoMethodError: undefined method `+’ for nil:NilClass

In the second one, it evaluated puts(3) (including actually puts’ing
3) and then tries to add 2 to it, which fails.

Also:

irb(main):004:0> puts puts (3)
(irb):4: warning: don’t put space before argument parentheses
3
nil

which does the same as puts puts(3) but gives you that warning.

for a multiline declaration with clarity of commas

tmp = {
:message => ‘tmp’ ,
:name => ‘tmp’ ,
:email => ‘tmp’
}

At the very great risk of sounding curmudgeonly, could I put in a
heartfelt plea for people not to do that? It looks bizarre, and seems
to invite scrutiny in case there’s been some kind of mistake or
omission.

David

Aha, but why does that scheme break down? Knowing that would prevent
me from running future problems. The class documentation()http://
api.rubyonrails.org/classes/HashWithIndifferentAccess.html) does not
bring me very far either. Especially the line:

does not inspire confidence.

On Jul 14, 2:36 pm, Matthew R. [email protected]

Hmmm, alright. I still don’t understand why the parser does not just
run until it encounters an other curly brace (}). But I can live with
it.

On Jul 14, 2:41 pm, Matthew R. [email protected]

Interesing example! I should use that in class. Thanks.