Ruby 1.9 hash with a dash in a key
Asked Answered
L

4

57

In ruby 1.9 is there a way to define this hash with the new syntax?

irb> { a:  2 }
=> {:a=>2}

irb> { a-b:  2 }
SyntaxError: (irb):5: syntax error, unexpected tLABEL
{ a-b:  2 }
      ^

with the old one, it's working:

irb> { :"a-b" =>  2 }
=> {:"a-b"=>2}
Lohner answered 25/1, 2010 at 18:49 Comment(0)
S
12

As of Ruby 2.2, you also can use following syntax:

{a: 1, b: 2, 'c-c': 3, d: 4}
Sidoney answered 27/10, 2016 at 7:45 Comment(4)
awesome! +1 for updating with the new ruby syntax, from which version is available? 2? 2.1?Lohner
I don't know, i just tried this syntax and it had worked :)Sidoney
@Lohner new syntax is available since 2.2: github.com/ruby/ruby/blob/v2_2_0/NEWS#language-changesLippold
@EddyMulyono +1Lohner
J
64

There are some legitimate symbols that cannot be used with the new syntax. I cannot find a reference, but it appears that a symbol name matching /^[a-zA-Z_][a-zA-Z_0-9]*[!?]?$/ is allowed with the new syntax. The last character may be the special character "!" or "?".

For any symbol that does not meet these restrictions, you have to use the Ruby 1.8 syntax, :'my-symbol-name'

Jeromejeromy answered 25/1, 2010 at 19:9 Comment(7)
Which makes sense; how is the Ruby interpreter supposed to read that, otherwise?Risinger
I checked in parse.c and it seems that with the new syntax the symbol is parsed as tLabel token. And matching name is more like /[a-zA-Z_][a-zA-Z0-9]/ :-)Seger
@MBO, Extra points for going to the source. I've edited the regex in my answer. Thanks!Jeromejeromy
@prusswan - I can't imagine a purist programming in Ruby.Jeromejeromy
In Ruby 2.1 and Rails 4.0, passing data: { my_attr: 'foo' } to a helper method like button_tag will produce data-my-attr="foo" in the rendered HTMLGreggs
? and ! are also also valid characters if they are the final characters before the colon. Similar to method names. So this is valid: {a: 1, b?: 2, c!: 3}Unimposing
@ChrisBeck the same thing works with Ruby 2.0 and Rails 3.2, e.g. data: { my_attr: 'foo' } -> data-my-attr="foo".Abrams
S
24

You can combine the old and new syntax:

{a: 1, b: 2, :'c-c' => 3, d: 4}
Surtout answered 23/5, 2012 at 15:15 Comment(0)
L
24

To use dashes with the new syntax:

<%= link_to "Link", link_path, {data: {something: 'value1', somethingelse: 'value2'}} %>

This will generate:

<a href="/link" data-something='value1' data-somethingelse='value2'>Link</a>

This might not exactly be your particular use case, but I found this post while trying to find an answer myself so I thought I'd share my findings.

Liger answered 18/7, 2012 at 23:45 Comment(2)
AFAIK, this is specific to the data attributes, if you have other attributes with dashes you have to use the old syntax.Graubert
The HAML documentation mentions data attributes separately. As a bonus, you can get multiple dashes by using underscores: data: {author_id: 123}. Great stuff.Graubert
S
12

As of Ruby 2.2, you also can use following syntax:

{a: 1, b: 2, 'c-c': 3, d: 4}
Sidoney answered 27/10, 2016 at 7:45 Comment(4)
awesome! +1 for updating with the new ruby syntax, from which version is available? 2? 2.1?Lohner
I don't know, i just tried this syntax and it had worked :)Sidoney
@Lohner new syntax is available since 2.2: github.com/ruby/ruby/blob/v2_2_0/NEWS#language-changesLippold
@EddyMulyono +1Lohner

© 2022 - 2024 — McMap. All rights reserved.