Различные обратные вызовы модели в зависимости от того, для API или в приложении - PullRequest
0 голосов
/ 26 сентября 2018

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

# app/models/user.rb
before_create :create_activation_digest

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

# app/models/user.rb
before_create :generate_access_token

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

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

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

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

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

0 голосов
/ 26 сентября 2018

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

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

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

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

attr_accessor :created_from_api

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

before_create :create_activation_digest, unless: :created_from_api

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

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