I’d like to use a Ruby Module to store a set of configuration defaults.
I’m having some problems using the values and hope someone could help.
This may not be the best way to do this but this is what I’ve come up with so far.
Here is a module to hold value for a persons Resume => resume.rb
module Resume
require 'ostruct'
attr_reader :personal, :education
@personal = OpenStruct.new
@education = Array.new
def self.included(base)
set_personal
set_education
end
def self.set_personal
@personal.name = "Joe Blogs"
@personal.email_address = 'joe.blogs@gmail.com'
@personal.phone_number = '5555 55 55 555'
end
def self.set_education
@education << %w{ School\ 1 Description\ 1 }
@education << %w{ School\ 2 Description\ 2 }
end
end
From irb it works fine:
% irb -I .
1.9.3-p194 :001 > require 'resume'
=> true
1.9.3-p194 :002 > include Resume
=> Object
1.9.3-p194 :003 > puts Resume.personal.name
Joe Blogs
=> nil
However when I include this into a class it throws and error => build.rb
require 'resume'
class Build
include Resume
def build
puts Resume.personal.name
end
end
From irb:
% irb -I .
1.9.3-p194 :001 > require 'build'
=> true
1.9.3-p194 :002 > b = Build.new
=> #<Build:0x00000001d0ebb0>
1.9.3-p194 :003 > b.build
NoMethodError: undefined method `personal' for Resume:Module
from /home/oolyme/projects/lh_resume_builder_ruby/build.rb:7:in `build'
from (irb):3
from /home/oolyme/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>'
I’ve tried a few variations to output the include module variables in the Build class instance but all error out.
attr_accessorcreates a couple of instance methods, meaning that they will be available on an instance ofBuild. But you clearly want class instance methods. Change definition of your module to this:And it’ll work