gpt4 book ai didi

ruby-on-rails - 为什么是:if not being recognised by ActiveRecord validations?

转载 作者:太空宇宙 更新时间:2023-11-03 16:11:13 25 4
gpt4 key购买 nike

我遇到一个问题,ActiveRecord 验证中的 :if 子句没有被兑现。

我的模型有一个 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 range1)'Arc should have one error with a non-numeric port' FAILEDexpected 1 errors on :ip_port, got 2./spec/models/arc_spec.rb:21:Finished in 0.108245 seconds

我的问题是,当 :if 子句应阻止调用 validates_inclusion 时,为什么我会收到非数字 ip_port 的两个错误。

这是在 OS/X 10.6.3 上使用 Ruby 1.8.7 的 Rails 2.3.5

最佳答案

在沉思的散步中,我解决了自己的问题。

问题在于,为了验证是否包含在范围内,它将提供的值转换为 int,然后检查是否包含。因此,对于非数字值,我将得到 :not_a_number 和 :inclusion 错误。

答案是修改 :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+$/) }

然后这三个条件中的每一个都会给我一个错误。

关于ruby-on-rails - 为什么是:if not being recognised by ActiveRecord validations?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3156545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com