# Is there a way to store items in a hash, yet refer to them a

**URL:** <https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667>\
**Category:** Rails\
**Created:** [March 30, 2007, 8:50pm UTC](https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667 "2007-03-30T20:50:38Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 30, 2007, 8:50pm UTC](https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667/1 "2007-03-30T20:50:38Z")

</div>

Hi,

Many of the view helpers require an object with accessor methods as  
parameters.

There are times however, when I want to store a collection of  
variables in a hash,  
and yet be able to use these helpers.

Look at this example:  
\<%= text\_area “person”, “description” %\>  
This works great for the case where I have a “person” object, with a  
“description” attribute.  
But what if I need to store the data in a hash, like this:  
person[‘description’]  
I don’t want to write a wrapper function to get all the hash values.  
I would like to  
use a gem or other builtin mechanism to be able to refer to  
person.description -or-  
person[‘description’]  
interchangeably.

Is there a way to store variables in a collection (like a hash), and  
use the keys of the  
hash as accessor names in view helpers? Has anyone written one  
already?

Thanks,

David

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 30, 2007, 9:39pm UTC](https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667/2 "2007-03-30T21:39:48Z")

</div>

Hi David,

removed\_email\_address@domain.invalid wrote:

> Is there a way to store variables in a collection  
> (like a hash), and use the keys of the hash as  
> accessor names in view helpers?

Cool idea.

Best regards,  
Bill

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 30, 2007, 10:24pm UTC](https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667/3 "2007-03-30T22:24:53Z")

</div>

This is dead simple and read-only, but how 'bout something like:

class HashyTest \< Test::Unit::TestCase  
def test\_hashy\_things  
hash = HashWithIndifferentAccess.new

```
hash["monkeys"] = "These are monkeys."
hash["monkeys!"] = "Yes, monkeys!"
hash[:"monkeys?"] = "Do you like monkeys too?"

def hash.method_missing(sym, *args)
  self[sym]
end

assert_equal(hash["monkeys"], hash.monkeys)
assert_equal(hash["monkeys!"], hash.monkeys!)
assert_equal(hash[:"monkeys?"], hash.monkeys?)

```

end  
end

~ j.

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 30, 2007, 10:39pm UTC](https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667/4 "2007-03-30T22:39:54Z")

</div>

Hm. Might want to make this just slightly less confusing for methods  
that don’t map to a key:

```
def hash.method_missing(sym, *args)
  include? sym and return self[sym]
  super
end

```

~ j.

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 31, 2007, 6:03am UTC](https://www.ruby-forum.com/t/is-there-a-way-to-store-items-in-a-hash-yet-refer-to-them-a/90667/5 "2007-03-31T06:03:36Z")

</div>

John B. wrote:

> def hash.method\_missing(sym, \*args)  
> self[sym]  
> end

Here’s a mildly destructive “Monkey Patch”, showing that technique to  
avoid  
writing too much attributes[‘blah’] all over the place.

class REXML::Element  
def method\_missing(symbol)  
attr\_name = symbol.id2name  
attr\_name.gsub!(/!$/, ‘’)

```
unless attributes.has_key?(attr_name)
  raise NoMethodError,
        "missing attribute: `#{attr_name}` in "+
          "<#{name} #{attributes.keys.join(' ')}>",
        caller
end
return attributes[attr_name]

```

end  
end

Problem: It interferes with other Monkey Patches on REXML. (Too many  
monkeys  
climbing that inheritance tree!) I need to get around to seeing if blah?  
would work better, for a clean read, and if the patch could call some  
equivalent of ‘super’ would allow other monkey patches to pass thru.

Here’s its home project, a plugin, and its file:

[http://phlip.svnrepository.com/svn/yar\_wiki](http://phlip.svnrepository.com/svn/yar_wiki)  
[http://phlip.svnrepository.com/svn/yar\_wiki/lib/assert\_xpath.rb](http://phlip.svnrepository.com/svn/yar_wiki/lib/assert_xpath.rb)

–  
Phlip  
["Pigleg too?", week 1](http://flea.sourceforge.net/PiglegToo_1.html)
