В моем обновлении и методе создания для моего игрового контроллера я создаю некоторые game_events. Затем на моей игровой модели должны выполняться обратные вызовы after_save. Эти обратные вызовы генерируют данные, которые мне нужны, и сохраняются в соответствующих столбцах. Однако проблема, с которой я столкнулся, заключается в том, что game_events создаются, кажется, после вызова обратных вызовов. Так что мой обратный вызов set_events_user, похоже, не подтверждает наличие каких-либо game_events. Однако, если из консоли я сохраняю игру во второй раз, обратные вызовы подтверждают эти game_events, и данные events_user генерируются нормально.
По сути, причина, по которой мои методы контроллера для обновления и создания выглядят так странно, заключается в том, что я пробовал разные способы переупорядочить порядок событий, чтобы при выполнении обратных вызовов game_events были подтверждены. Я попытался извлечь фрагмент кода, в котором он перебирает массив events_user из параметров, в отдельный метод, а затем вызывая save во второй раз в одном методе, чтобы он подтвердил события.
def create
@game = Game.create(game_params)
authorize @game
@game.organization_id = current_user.organization_id
params[:events_user].each do |e|
@game.game_events.create({
event_type: e["event_type"],
event_id: e["event_id"],
})
end
@game.save
render json: @game, status: :ok
rescue StandardError => e
render json: @game.errors, status: :unprocessable_entity
end
def update
authorize @game
@game.game_events.destroy_all
params[:events_user].each do |e|
@game.game_events.create({
event_type: e["event_type"],
event_id: e["event_id"],
})
end
@game.update(game_params)
render json: @game, status: :ok
rescue StandardError => e
render json: @game.errors, status: :unprocessable_entity
end
after_save :set_events_user
def set_events_user
@sequence = []
self.game_events.by_sequence.each do |e|
@e = {}
@e[:id] = e.id
@e[:event_id] = e.event_id
@e[:event_type] = e.event_type
@e[:question_text] = e.event.question_text
@e[:a1] = {es: e.event.a1, en: e.event.a1 }
@e[:a2] = {es: e.event.a2, en: e.event.a2 }
@e[:a3] = {es: e.event.a3, en: e.event.a3 }
@e[:correct_answer] = e.event.correct_answer if e.event_type == 'Question'
@sequence << @e
end
@sequence.to_json
self.events_user = @sequence
end
Нет сообщения об ошибке, но я ожидаю, что gme_events созданы, обратный вызов запускается при сохранении, и игра сохраняется с сгенерированными данными. Однако, если я не сохраню его вручную из консоли во второй раз, в первый раз данные будут пустыми, поскольку они не будут подтверждать игровые события.