Я использую devise_invitable (2.0.6)
приглашение_принято? возвращает FALSE в after_invitation_accepted CALLBACK, но когда я делаю паузу здесь и проверяю консоль рельсов, это дает мне true для приглашения_accepted?
user.rb
after_invitation_accepted :create_something
def create_something
create_service unless invitation_sent_at? && !invitation_accepted?
end
здесь, приглашение_принято? внутри этого обратного вызова является ложным, но когда я делаю паузу и проверяю консоль рельсов, это дает мне true
Я что-то пропустил??
Вопрос @smathy дополнен кодом
Покажите сеанс консоли, показывающий все, что означает «когда я делаю паузу здесь и проверяю».





Прямо над надписью приглашение_принято есть комментарий? в исходном коде:
# Verifies whether a user accepted an invitation (false when user is accepting it)
def invitation_accepted?
!accepting_invitation? && invitation_accepted_at.present?
end
Это означает, что invitation_accepted? не true пока пользователь принимает приглашение, а только после того, как пользователь принял приглашение.
Глядя на реализацию Accept_invitation! затем мы видим, что @accepting_invitation установлено в true в методе до принятия приглашения, но не установлено в false после обновления записи в базе данных.
То есть только после перезагрузки пользователь из базы invitation_accepted? вернётся true.
Спасибо за подробное объяснение. Поэтому нет необходимости проверять условие внутри обратного вызова, поскольку это обратный вызов after_invitation_accepted.
Точнее, обратный вызов after_invitation_accepted вызывается только сразу после того, как приглашение было принято и когда это принятие было успешно записано в базу данных. Если принятие не было сохранено, например, из-за ошибки проверки, обратный вызов не будет вызван.