Я хочу добавить в свое веб-приложение мобильное приложение, которое имеет некоторые отличия от модели User. В частности, когда пользователь регистрируется в веб-приложении, модель генерирует дайджест активации, который отправляется им по электронной почте для нажатия. Обратный вызов:

# app/models/user.rb
before_create :create_activation_digest

Я буду использовать другой Users_controller для api с пространством имен api. Когда новый пользователь регистрируется из мобильного приложения, я не хочу создавать дайджест активации, а вместо этого генерирую токен доступа.

# app/models/user.rb
before_create :generate_access_token

Итак, как лучше всего запустить первый, если это регистрация в приложении, и второй, если это регистрация в мобильном приложении. Могу ли я вызвать метод из контроллера вместо обратного вызова модели? Или в модели есть способ лучше?

0
Steve Carey 26 Сен 2018 в 03:53

2 ответа

Лучший ответ

По моему опыту, любой ценой избегайте обратных вызовов модели. Их сложно пропустить, немного сложно протестировать, сложно настроить в зависимости от контекста.

Я бы подумал о создании классов пользовательских фабрик и вызове их в ваших контроллерах, вы можете легко передать контекст и выполнить любую другую необходимую настройку.

Отредактируйте, так как я действительно не дал вам способ сделать это.

Если вы действительно хотите добиться этого с помощью обратных вызовов, вероятно, единственный способ сделать это - определить новый атрибут в вашей пользовательской модели (не поддерживаемый полем базы данных), например

attr_accessor :created_from_api

Установка этого атрибута в вашем контроллере, а затем настройка обратных вызовов вашей модели, например

before_create :create_activation_digest, unless: :created_from_api

Это должно сработать, но если бы я был на вашем месте, я бы действительно отказался от обратных вызовов.

2
Marcin Kołodziej 26 Сен 2018 в 00:58

Мне кажется, что создание и активация дайджеста и генерация токена доступа не относятся к модели User - это кажется слишком большой ответственностью для User.

Лично я бы сказал то же самое и о контроллерах.

Итак, я бы посоветовал вам использовать служебный объект.

0
jvillian 26 Сен 2018 в 00:59