多列属性轨道

时间:2010-11-27 20:29:15

标签: ruby-on-rails

在Rails 3.0.3模型中给定复合虚拟属性如何将组件属性上的错误自动放置在复合属性上?例如:

validates_presence_of :first_name
validates_presence_of :last_name

def name
    "#{first_name} #{last_name}"
end

def name=(name)
   first_name, last_name = name.split
end

给出:

@model.errors[:name] = @model.errors[:first_name] + @model.errors[:last_name]

请注意,这是一个简化的示例,我无法轻松地将组件属性中的验证移动到复合属性的新验证方法中。

另一个例子是Paperclip gem,其中大小(attachment_size)的验证放在属性'attachment'上。有什么想法吗?

感谢。

2 个答案:

答案 0 :(得分:0)

就个人而言,我在first_namelast_name字段上没有任何“正常”验证。相反,我会将它留在自定义验证器的有能力的手中:

validate :name_is_valid

def name_is_valid
  if first_name.blank? || last_name.blank?
    errors.add(:name, "You must specify both your first and last name")
  end
end

答案 1 :(得分:0)

结束于:

after_validation do

  self.errors[:first_name].each do |message|
    self.errors.add(:name, message)
  end

  self.errors[:last_name].each do |message|
    self.errors.add(:name, message)
  end

  self.errors.delete(:first_name)
  self.errors.delete(:last_name)

end