Is there a way to store items in a hash, yet refer to them as class methods?

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

Hi David,

dtrusty@my-deja.com 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

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.

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.

John Barnette 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/lib/assert_xpath.rb