How to use class_eval <<-"end_eval" in Ruby? Not parsing correctly
- by viatropos
I would like to define dynamic methods based on some options people give when instantiating it. So in their AR model, they'd do something like this:
acts_as_something :class_name => "CustomClass"
I'm trying to implement that like so:
module MyModule
def self.included(base)
as = Config.class_name.underscore
foreign_key = "#{as}_id"
# 1 - class eval, throws these errors
# ~/test-project/helpers/form.rb:45: syntax error, unexpected $undefined
# @ ||= MyForm.new(
# ^
# ~/test-project/helpers/form.rb:46: syntax error, unexpected ','
#~/test-project/helpers/form.rb:48: syntax error, unexpected ')',
# expecting kEND from ~/test-project/helpers.rb:12:in `include'
base.class_eval <<-"end_eval", __FILE__, __LINE__
attr_accessor :#{as}
def #{as}
@#{as} ||= MyForm.new(
:id => self.#{foreign_key},
:title => self.title
)
@#{as}
end
end_eval
end
end
But it's throwing a bunch of errors I've printed in the comments. Am I using this incorrectly? What are some better ways I can define dynamic method names and dynamic names inside the method like this? I see people use this often instead of define_method (see these classes in resource_controller and couchrest toward the bottom). What I missing here?
Thanks for the help