Отметить недействительный атрибут в ActiveRecord - PullRequest
3 голосов
/ 01 марта 2011

Я пытаюсь реализовать функциональность, при которой атрибут, однажды установленный, не может быть изменен в модели ActiveRecord. С этой целью я написал следующие методы:

def address
 self[:address]
end

def address=(val)
 if new_record?
  self[:address] = val
 else
  errors.add(:address, "Cannot change address, once it is set")
  return false # tried return nil here first, did not work
 end
end

Я что-то здесь не так делаю? Я хочу, чтобы объект был недействительным, когда я пытаюсь изменить адрес, но я не получаю никаких ошибок, когда я obj.valid?

РЕДАКТИРОВАТЬ: значение не изменяется после его установки, но я хотел бы получить недействительный объект, когда я делаю проверку через obj.valid?

1 Ответ

8 голосов
/ 01 марта 2011

Когда вы делаете obj.valid?, он очищает все ваши ошибки, а затем запускает каждую проверку по очереди.Чтобы это привело к ошибке проверки, вам нужно переместить эту логику в блок проверки.

Вот пример одного из способов сделать это с помощью переменной экземпляра:

def address=(val)
  if new_record?
    self[:address] = val
  else
    @addr_change = true
    return false # tried return nil here first, did not work
  end
end

validate do |user|
  errors.add(:address, "Cannot change address, once it is set") if @addr_change
end
...