Skip to content

Commit

Permalink
Allowing validation with :if => block
Browse files Browse the repository at this point in the history
  • Loading branch information
dtsato committed Jun 2, 2008
1 parent a0696af commit a62844b
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 7 deletions.
23 changes: 16 additions & 7 deletions sequel/lib/sequel_model/validations.rb
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ def validates_acceptance_of(*atts)
}.merge!(atts.extract_options!)

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
o.errors[a] << opts[:message] unless v == opts[:accept]
end
Expand All @@ -167,7 +167,7 @@ def validates_confirmation_of(*atts)
}.merge!(atts.extract_options!)

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
c = o.send(:"#{a}_confirmation")
o.errors[a] << opts[:message] unless v == c
Expand Down Expand Up @@ -196,7 +196,7 @@ def validates_format_of(*atts)
end

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
o.errors[a] << opts[:message] unless v.to_s =~ opts[:with]
end
Expand All @@ -211,7 +211,7 @@ def validates_length_of(*atts)
}.merge!(atts.extract_options!)

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
if m = opts[:maximum]
o.errors[a] << (opts[:message] || opts[:too_long]) unless v && v.size <= m
Expand All @@ -235,7 +235,7 @@ def validates_numericality_of(*atts)
}.merge!(atts.extract_options!)

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
next if (v.nil? && opts[:allow_nil]) || (v.blank? && opts[:allow_blank])
begin
if opts[:only_integer]
Expand All @@ -256,7 +256,7 @@ def validates_presence_of(*atts)
}.merge!(atts.extract_options!)

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
o.errors[a] << opts[:message] unless v && !v.blank?
end
end
Expand All @@ -270,7 +270,7 @@ def validates_uniqueness_of(*atts)
}.merge!(atts.extract_options!)

validates_each(*atts) do |o, a, v|
next if (opts[:if] && !o.send(opts[:if]))
next unless o.instance_eval(&if_proc(opts))
next if v.blank?
num_dups = o.class.filter(a => v).count
allow = if num_dups == 0
Expand All @@ -297,5 +297,14 @@ def validates_uniqueness_of(*atts)
def validations
@validations ||= Hash.new {|h, k| h[k] = []}
end

protected
def if_proc(opts)
case opts[:if]
when Symbol then proc {send opts[:if]}
when Proc then opts[:if]
else proc {true}
end
end
end
end
6 changes: 6 additions & 0 deletions sequel/spec/validations_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,12 @@ def dont_skip; true; end
@m.value = 'a'
@m.should be_valid
end

specify "should validate with :if => block" do
@c.validates_presence_of :value, :if => proc {false}

@m.should be_valid
end
end

context "Superclass validations" do
Expand Down

0 comments on commit a62844b

Please sign in to comment.