ActiveRecord: скрыть столбец при возврате объекта

Есть ли готовый способ всегда скрывать/удалять столбец (скажем, User.password) при возврате объекта ActiveRecord? Спасибо.

Ответ 1

Используя встроенную сериализацию, вы можете переопределить метод as_json на вашей модели, чтобы передать дополнительные параметры по умолчанию:

class User < ActiveRecord::Base
  # ...
  def as_json(options = {})
    super(options.merge({ except: [:password, :oauth_token] }))
  end
end

Есть, вероятно, лучшие инструменты для сериализации - если вы ищете более мелкозернистый контроль, я бы рекомендовал проверить active_model_serializers или rabl.

Ответ 2

Вы попали на эту страницу, потому что пытаетесь скрыть пароли обычного текста?

STOP! вы делаете это неправильно.

ошибка http://e-abaco.net/wp-content/uploads/2009/06/bug-feature.jpg

Вы не должны никогда не хранить пароли в виде обычного текста.

Скорее всего, ваш сервер имеет или будет иметь какой-то недостаток, а хакеры получат ваши пароли клиентов. Подумайте немного:

  • Что вы им скажете?
  • Как они будут реагировать?
  • Каковы результаты для вашего бизнеса?

Поскольку вы теперь новый человек и ищете правильный способ хранения паролей, вы можете прочитать эту хорошую статью

p >

Ответ 3

Вы можете скрыть определенный атрибут во время сериализации с помощью :except:

render json: @users, except: [:password, :other]

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

class User < ActiveRecord::Base
  attr_accessor :hidden_password, :hidden_other
  after_initialize :hide_columns

  def hide_columns
    [:password, :other].each do |c|
      send("hidden_#{c}=", send(c))
      send("#{c}=", nil)
    end
  end
end