Предотвратить изменение одного поля в модели Rails - программирование
Подтвердить что ты не робот

Предотвратить изменение одного поля в модели Rails

У меня есть две связанные модели - скажем Activity и Step. Activity has_many :steps и Step belongs_to :activity, что означает, что таблица для steps имеет столбец activity_id.

Это в Hobo 1.3, поэтому Rails 3.0.

Я хочу, чтобы после создания Step невозможно переместить шаг на другой Activity. Мы не хотим, чтобы поле activity_id менялось.

Я удалил поле из форм редактирования, но я ищу более сильное ограничение. По существу, я хочу проверить на update (не на create), что столбец не касается. Документация Hobo не предлагает ничего подобного в Hobo, поэтому я смотрю Rails валидации, но до сих пор я не нашел "только делать это на update", которое я помню, или подтверждение того, что что-то не меняется.

4b9b3361

Ответ 1

Вы можете объявить атрибут как read_only с помощью attr_readonly :your_field_name. Но это не создаст ошибки, если вы попытаетесь написать этот атрибут, он будет терпеть неудачу. (Этот атрибут будет проигнорирован для всех SQL-обновлений)

Другой вариант может заключаться в том, чтобы написать подтверждение для этого случая, может выглядеть так:

class Step < ActiveRecord::Base
  validate :activity_id_not_changed

  private

  def activity_id_not_changed
    if activity_id_changed? && self.persisted?
      errors.add(:activity_id, "Change of activity_id not allowed!")
    end
  end
end

persisted? возвращает true, если это не новая запись, и она не уничтожена.

Ссылки:

http://api.rubyonrails.org/classes/ActiveRecord/ReadonlyAttributes/ClassMethods.html#method-i-readonly_attributes

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-persisted-3F

Ответ 2

Я думаю, вы тоже можете сделать это с помощью системы разрешений Hobo: http://hobocentral.net/manual/permissions

Например:

def update_permitted?
  acting_user.administrator && !activity_id_changed?
end