В контроллере API я хотел бы ограничить, какие поля модели можно увидеть в зависимости от того, кто вошел в систему. Сериализаторы ActiveModel, казалось бы, позволяют это, но мне не повезло со следующим:
class MyModelSerializer < ActiveModel::Serializer
attributes :name, :custom_field, :secret_field
has_many :linked_records
def custom_field
object.do_something
end
def filter(keys)
unless scope.is_admin?
keys.delete :secret_field
keys.delete :linked_records
end
keys
end
end
Но фильтрация никогда не выполняется, и поэтому мой вывод всегда содержит: secret_field и: connected_records, даже если пользователь не вошел в систему.
Возможно, это потому, что я использую Rails 6, и может показаться, что ActiveModel Serializer больше не может быть лучшим инструментом (например, https://stevenyue.com/blogs/migrating-active-model-serializers-to-jserializer).
Пожалуйста, предложите свои предложения для средств для этого, если вы можете думать о лучше значит.
РЕДАКТИРОВАТЬ:
В дополнение ко всем комментариям ниже, вот несколько другой код:
attributes :name, :id, :admin_only_field, :is_admin
$admin_only = %i[:id, :admin_only_field]
def attributes(*args)
hash = super
$admin_only.each do |key|
unless scope.is_admin?
hash.delete(key)
end
end
hash
end
def is_admin
if scope.is_admin?
'admin!'
else
'not an admin!'
end
end
Если я тогда посещаю индексную страницу модели, не будучи администратором, я вижу, что admin_only_field и id оба присутствуют, а is_admin говорит, что я нет. Bizarre.