Есть ли нестандартный способ всегда скрывать / удалять столбец (скажем, User.password) при возврате объекта ActiveRecord?
ActiveRecord: скрыть столбец при возврате объекта
Ответы (4)
Используя встроенную сериализацию, вы можете переопределить метод as_json
в своей модели, чтобы передать дополнительные параметры по умолчанию:
class User < ActiveRecord::Base
# ...
def as_json(options = {})
super(options.merge({ except: [:password, :oauth_token] }))
end
end
Вероятно, существуют лучшие инструменты сериализации - если вы ищете более детальный контроль, я бы рекомендовал проверить active_model_serializers
или rabl
.
active_model_serializers
. Но переопределение as_json
- это то, что я искал. Спасибо !
- person zakelfassi; 02.05.2013
@manager.to_json(include: :user)
, я все равно получаю файл password_digest, сохраненный в объекте пользователя.
- person Sandeep; 11.04.2017
Вы попали на эту страницу, потому что пытаетесь скрыть пароли в виде простого текста?
СТОП! вы делаете это неправильно.
Никогда не храните пароли в виде обычного текста.
Скорее всего, ваш сервер имеет или будет иметь какой-то недостаток, и хакеры получат пароли ваших клиентов. Подумайте немного:
- Что ты им скажешь?
- Как они отреагируют?
- Каковы результаты для вашего бизнеса?
Поскольку вы теперь новый человек и ищете правильный способ хранения паролей, вы можете хочу прочитать эту красивую статью
Вы можете скрыть определенный атрибут во время сериализации, используя :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
except
, но after_initialize
кажется аккуратным.
- person zakelfassi; 02.05.2013
Спустя 8 лет в Rails 5+ появился способ игнорировать / скрывать столбцы из модели:
ActiveRecord::Migration.new.create_table :my_pages do |t|
t.string :title
t.string :body
t.string :search_tsv
end
class MyPage < ActiveRecord::Base
self.ignored_columns = %w[search_tsv]
end
MyPage.new
# => #<MyPage:0x00007fa4693b8278 id: nil, title: nil, body: nil>
class MyPage2 < ActiveRecord::Base
self.table_name = 'my_pages'
self.ignored_columns = %w[body search_tsv]
end
MyPage2.new
# => #<MyPage2:0x00007fa46845f808 id: nil, title: nil>
render :json => @users
- person zakelfassi   schedule 02.05.2013