我正在研究铁轨上的模型 它用于存储具有IP和子网信息的网络设备 它应该做的一件事是检查设备的IP是否在相应的子网中,如果不是,则显示奇特的错误。
验证本身效果很好,但错误消息错过了IP地址的点 我的代码的相关部分是:
class Device < ApplicationRecord
belongs_to :subnet
validates :subnet, :presence => true
validates :name, presence: true, uniqueness: {scope: :subnet_id}
validates :IP, presence: true, uniqueness: {scope: :subnet_id}
validates :MAC, presence: true, uniqueness: {scope: :subnet_id}
validates_format_of :MAC, :with => /\A([0-9a-fA-F]{2}[:]){5}[0-9a-fA-F]{2}\z/i
validate :isInSub
...
private
def isInSub
unless NetAddr::CIDR.create(self.subnet.CIDR.to_str,Version:4).matches?(self.IP.to_str)
errors.add(self.IP.to_str, "is not in the Subnet #{self.subnet.CIDR.to_str}")
end
rescue
errors.add(self.IP.to_str, "is no valid IP")
print(self.IP.to_str) <--- This output has the dots!
end
因此,如果在“制作”IP地址时出现问题,我会添加一个通用的“无效”错误 但是当IP正确但不在子网中时,我会添加一个不同的错误。
验证本身有效,我在表单中收到错误消息,但IP未正确显示。缺少这些点,但只有IP地址 - 来自Subnet CIDR,它们就在那里。
所以错误应该是这样的
但它看起来像这样
两个错误消息都会出现问题,但在print
我添加为调试时,点仍然存在。
有没有办法解决这个问题而不打开各种注射攻击?
答案 0 :(得分:3)
Rails在显示错误列表时调用errors.full_messages
,这些错误会使属性人性化,在这种情况下为192.168.2.255
,因此删除了点。
您可以将属性正确添加到错误中,即
errors.add(:IP, "#{self.IP.to_str} is not in the Subnet #{self.subnet.CIDR.to_str}")
这应该会生成如下所示的错误消息
IP 192.168.2.255不在子网192.168.1.1/24