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?
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.