验证类似于attr_readonly,但忽略空白属性

时间:2016-03-18 03:10:51

标签: ruby-on-rails ruby ruby-on-rails-4

我正在努力使列只有在空白时才能填充和更新。与attr_readonly类似,但如果属性为空,则允许更新。

这是我的悲惨尝试,它失败了,因为before_update试图在实例上调用attr_readonly

before_update :check_attrs

def check_attrs
  if column_1.present?
    attr_readonly :column_1
  elsif column_2.present?
    attr_readonly :column_2
  elsif column_3.present?
    attr_readonly :column_3
  elsif column_4.present?
    attr_readonly :column_4
  end
end

1 个答案:

答案 0 :(得分:1)

我将假设我们正在讨论一个扩展ActiveRecord::Base的'模型'类......

我的想法是使用验证来强制执行规则:除非原始值为空,否则无法设置值。

虽然是另一个问题,但这有助于:Pass field name as parameter to custom validation method Rails 4

validates_each的API文档:

validates_each :column_1, :column_2, :column_3, :column_4 do |record, attr, value|
  attr_was_present = record.changed_attributes[attr].present?
  record.errors.add(attr, 'can only change if blank') if attr_was_present
end

PS:这可以是一个单行,我添加了一个局部变量(希望)增加一点清晰度。

这将做的是在尝试更改它的任何属性的错误列表中添加“只能更改为空白”错误。然后save将失败,数据库记录将不会更改。