Hi,
I have code which generates a definition of a survey / questionnaire
using a few related AR tables. The code I need help with is the code
which converts the survey definition into an object I can pass to the
view to generate the survey form for the user to fill in.
I have a non-AR object called SurveyData. It extends ValidatingBase,
which is described here: http://wiki.rubyonrails.com/rails/pages/
HowToUseValidationsWithoutExtendingActiveRecord
basically it lets you use ActiveRecord::Validations on a non-AR object.
What I want to do is dynamically read the questions that the survey
needs to ask, and for each one, do the equivalent of:
class SurveyData
attr_accessor fieldname
validates_presence_of fieldname
end
I''ve tried all sorts of things. This is my current non-working
version:
class SurveyData < ValidatingBase
include Reloadable
def add_required_fields(field_names)
[field_names].flatten.each { |name|
src=<<-END
attr_accessor :#{name}
validates_presence_of :#{name}
END
self.class.class_eval src, __FILE__, __LINE__
}
end
end
It appears to work, but my unit test fails because the
validates_presence_of line actually adds a validation method to the
base SurveyData class, which means a completely new instance of
SurveyData gets constructed with a validation already present.
Any help would be most appreciated!
Jon
PS the unit test is:
require File.dirname(__FILE__) + ''/../test_helper''
class SurveyDataTest < Test::Unit::TestCase
def test_validateable
sd = SurveyData.new
assert_not_nil sd
assert_raise(NoMethodError) {
sd.foo
}
assert sd.valid?
sd.add_required_fields ''foo''
assert_respond_to sd, :foo
assert_nothing_raised { sd.foo }
assert_equal false, sd.valid?, "SurveyData shouldn''t be valid
(because we haven''t set ''foo'' yet)"
sd.foo = "test"
assert_equal sd.foo, "test"
assert sd.valid?
test_sd = SurveyData.new
# **** THIS TEST FAILS:
assert test_sd.valid?, "a different SurveyData should be valid
(because we haven''t yet added any validations to it)"
end
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---