Предотвратить изменение одного поля в модели 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", которое я помню, или подтверждение того, что что-то не меняется.
Ответы
Ответ 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