Discussion Forums
- Topic List
- Most Recent Posts
- Sign In for more options
In some of the Ruby tutorials PROC are explained as callable objects in ruby and they are not executed unless called explicitly.
Like
pr = Proc.new { puts "Hello World" }
This statement is not executed at this point
But if we do
pr.call
it results in
=> Hello World
I would like to know how this works in our model validations
suppose we have
validates_length_of :user_name, :maximum => 40,:if => Proc.new { |user| !user.user_name.blank? }
so to do this validation we have specified a condition using a Proc block but how is this Proc block called ? is the call to Proc block made internally by rails?
\lib\ruby\gems\1.8\gems\activerecord-1.15.3\lib\active_record\validations.rb(from line 260):
def evaluate_condition(condition, record)
case condition
when Symbol: record.send(condition)
when String: eval(condition, binding)
else
if condition_block?(condition)
condition.call(record) #!!!!!!!!!!!!!!!!!!!!
else
raise(
ActiveRecordError,
"Validations need to be either a symbol, string (to be eval'ed), proc/method, or " +
"class implementing a static validation method"
)
end
end
end
[...]
def validates_each(*attrs)
options = attrs.last.is_a?(Hash) ? attrs.pop.symbolize_keys : {}
attrs = attrs.flatten
# Declare the validation.
send(validation_method(options[:on] || :save)) do |record|
# Don't validate when there is an :if condition and that condition is false
unless options[:if] && !evaluate_condition(options[:if], record) #!!!!!!!!!!!!!!!!!!!!
attrs.each do |attr|
value = record.send(attr)
next if value.nil? && options[:allow_nil]
yield record, attr, value
end
end
end
end
I'm glad you found this helpful Balaji:)
