在rails

时间:2018-01-23 09:56:20

标签: ruby-on-rails

我正在研究铁轨上的模型 它用于存储具有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,它们就在那里。

所以错误应该是这样的

      

        禁止1个错误         此设备保存:       

      
              
  • 192.168.2.255不在子网192.168.1.1/24
  • 中       
    

但它看起来像这样

      

        禁止1个错误         此设备保存:       

      
              
  • 192 168 2 255不在子网192.168.1.1/24
  • 中       

两个错误消息都会出现问题,但在print我添加为调试时,点仍然存在。

有没有办法解决这个问题而不打开各种注射攻击?

1 个答案:

答案 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