Сериализация Rails 6 моделей на основе current_user - PullRequest
0 голосов
/ 22 января 2020

В контроллере 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.

1 Ответ

0 голосов
/ 22 января 2020
class MyModelSerializer < ActiveModel::Serializer
  attributes :name, :custom_field, :secret_field

  has_many :linked_records

  def custom_field
    object.do_something
  end

 private

  def attributes
    hash = super
    unless scope.is_admin?
      hash.delete :secret_field
      hash.delete :linked_records
    end
    hash
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...