Почему: если не распознается валидациями ActiveRecord? - PullRequest
2 голосов
/ 01 июля 2010

У меня проблема, когда условие: if в валидации ActiveRecord не выполняется.

Моя модель имеет атрибут ip_port, который я проверяю как присутствующий, числовой и в определенном диапазоне. Я пытаюсь убедиться, что каждое условие генерирует только одну ошибку. Я не хочу ситуации, когда пустой атрибут приводит к тому, что пользователю выводятся три сообщения, в которых указывается, что он отсутствует, является обязательным и не числовым.

Это моя модель в ее нынешнем виде

class Arc < ActiveRecord::Base
  attr_accessible :ip_port

  validates_presence_of :ip_port
  validates_numericality_of :ip_port, :allow_blank => true
  validates_inclusion_of :ip_port, :in => 1025..65535, :allow_blank => true, 
     :if => Proc.new {|arc| arc.ip_port.to_s.match(/^\d+$/) }
end

А это моя спецификация модели и ее результаты.

describe Arc do
  it "should be valid with valid attributes" do
    Arc.new(:ip_port => 1200).should be_valid
  end
  it "should be invalid with a non-numberic port" do
    Arc.new(:ip_port => "test").should be_invalid
  end
  it "should be invalid with a missing port" do
    Arc.new(:ip_port => nil).should be_invalid
  end
  it "should have one error with a missing port" do
    a = Arc.new(:ip_port => nil)
    a.should be_invalid
    a.should have(1).errors_on(:ip_port)
  end
  it "should have one error with a non-numeric port" do
    a = Arc.new(:ip_port => "test")
    a.should be_invalid
    a.should have(1).errors_on(:ip_port)
  end
  it "should have one error with a numeric port outside the range" do
    a = Arc.new(:ip_port => 999)
    a.should be_invalid
    a.should have(1).errors_on(:ip_port)
  end
end
Arc
- should be valid with valid attributes
- should be invalid with a non-numberic port
- should be invalid with a missing port
- should have one error with a missing port
- should have one error with a non-numeric port (FAILED - 1)
- should have one error with a numeric port outside the range

1)
'Arc should have one error with a non-numeric port' FAILED
expected 1 errors on :ip_port, got 2
./spec/models/arc_spec.rb:21:

Finished in 0.108245 seconds

У меня вопрос, почему я получаю две ошибки для нечислового ip_port, когда предложение: if должно препятствовать вызову validates_inclusion для.

Это Rails 2.3.5 с Ruby 1.8.7 на OS / X 10.6.3

1 Ответ

2 голосов
/ 01 июля 2010

Имея созерцательную прогулку, я решил собственную проблему.

Проблема в том, что для проверки включения в пределах диапазона он преобразует предоставленное значение в int, а затем проверяет включение. Поэтому для нечислового значения я получу как: not_a_number, так и ошибку: include.

Ответ заключается в том, чтобы изменить предложение: if, чтобы использовать значение до того, как оно было приведено к типу, поэтому мой метод validates_inclusion_of становится

validates_inclusion_of :ip_port, :in => 1025..65535, :allow_blank => true, 
  :if => Proc.new {|arc| arc.ip_port_before_type_cast.to_s.match(/^\d+$/) }

Это дает мне одну ошибку для каждого из трех условий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...