Модель пользователя имеет следующие атрибуты:
:first_name, :last_name # these shouldn't be locked.
:social_no, :dob, :birth_country # these should be locked.
Теперь проблема заключается в следующем:
- Пользователь может поместить любые данные attr при создании / обновлении.
- После первой вставки / создания / обновления для последних трех блокируемых полей: social_no,: dob &: birth_country должны быть заблокированы, чтобы пользователь не мог обновить их только администратор.
- Сказать, что блокируется поля при создании пустые, теперь
i) при первом наборе пользователя обновления: social_no.
ii) при втором наборе обновления пользователя: dob, но не должно быть в состоянии изменить: social_no, поскольку оно уже установлено.
iii) при 3-м обновлении пользователь установил: birth_country, но не должен иметь возможность изменить: social_no &: dob.
Более подробно, блокируемые поля должны быть заблокированы после того, как данные были установлены впервые, независимо от того, были ли они созданы или обновлены, сразу или при любом действии обновления.
Мое решение:
class User < ApplicationRecord
attr_accessor :editable_by_admin
validate :validate_locked_attrs_not_editable, on: :update, unless: :editable_by_admin?
def editable_by_admin?
self.editable_by_admin == true
end
def validate_locked_attrs_not_editable
old_record = User.find(id)
User.locked_attrs.each do |attr|
unless old_record.send(attr).blank?
if old_record.send(attr) != self.send(attr)
self.errors.add(attr, "can't be edited.")
end
end
end
end
def self.locked_attrs
%i[
first_name
last_name
dob
birt_country
].freeze
end
end
Хотя решение работает, я думаю, что это не очень хороший подход. Есть ли другой способ решить проблему наилучшим образом. Спасибо.