DRYing up helper


I’m trying to make a helper in my application DRYer. Here is an edited
version of the current relevant code:

module MyControllerHelper
PERSON_FIELDS = [‘last_name’, ‘first_name’]
ADDRESS_FIELDS = [‘address_1’, ‘address_2’, ‘city’, ‘state’, ‘zip’]

def get_errors_on(section)
errors = ‘’

@person.errors.each do |attr,msg|
  case section
  when 'person'
    errors += "#{attr.humanize} #{msg}<br>" if

PERSON_FIELDS.include? attr
when ‘address’
errors += “#{attr.humanize} #{msg}
” if
ADDRESS_FIELDS.include? attr


end # def get_errors_on(section)
end # module WizardHelper

I have tried different versions of the following but always
@person.errors.each do |attr,msg|
errors += “#{attr.humanize} #{msg}
” if (section.upcase +
‘_FIELDS’).constantize.include? attr

I always get a message saying that, for example, PERSON_FIELDS
constant has not been defined, although it is defined at the top of
the module.

Any ideas?

Thank you.

pepe, you should be able to use eval(section.upcase + ‘_FIELDS’)
instead of constantize.

That being said, I can never suggest using eval unless I accompany
that with a warning, a la
Railsrocket.com is for sale | HugeDomains.
Also, I always valued readability over being DRY. Being DRY in your
case might be useful if you can reasonably expect to have more than
just PERSON and ADDRESS fields. Otherwise, you might be sacrificing
readability without cause.


Hi Liam,

I tried to use eval but couldn’t make it work in my prior attempts.
I’ll give it a shot again.

About the readability of the code I agree with you, my priority is
always make my code easy to read, then make it DRY. I currently have a
total of 4 sections that I have to run this code for but based on what
I know I very possibly will need to run the code for many more
sections in the future. If I get this one working right it will be a
big help in the future, but when the code gets ‘obscure’ I always
leave extensive comments for my sanity and that of the person coming

Thanks a lot.

eval worked indeed.

Thanks again. The solution, as usual, was simpler than what I thought
it would be. :slight_smile: