diff --git a/app/controllers/messages_controller.rb b/app/controllers/messages_controller.rb index 71c2107f3..252d6645c 100644 --- a/app/controllers/messages_controller.rb +++ b/app/controllers/messages_controller.rb @@ -15,6 +15,8 @@ class MessagesController < ApplicationController else redirect_to chat_path(@chat), alert: @message.errors.full_messages.to_sentence end + rescue ActiveRecord::InvalidForeignKey + redirect_to chats_path, alert: t(".chat_not_found") end # Called by the chat watchdog when an assistant "Thinking…" bubble has waited diff --git a/config/locales/views/messages/en.yml b/config/locales/views/messages/en.yml index dee376568..c0c6603ed 100644 --- a/config/locales/views/messages/en.yml +++ b/config/locales/views/messages/en.yml @@ -1,6 +1,8 @@ --- en: messages: + create: + chat_not_found: This chat is no longer available. chat_form: placeholder: "Ask anything ..." disclaimer: "AI responses are informational only. Not financial advice!" diff --git a/test/controllers/messages_controller_test.rb b/test/controllers/messages_controller_test.rb index d97fd3f96..6fdc425a4 100644 --- a/test/controllers/messages_controller_test.rb +++ b/test/controllers/messages_controller_test.rb @@ -12,6 +12,15 @@ class MessagesControllerTest < ActionDispatch::IntegrationTest assert_redirected_to chat_path(@chat, thinking: true) end + test "redirects to chats when message save races with chat deletion" do + UserMessage.any_instance.stubs(:save).raises(ActiveRecord::InvalidForeignKey) + + post chat_messages_url(@chat), params: { message: { content: "Hello", ai_model: "gpt-4.1" } } + + assert_redirected_to chats_path + assert_equal I18n.t("messages.create.chat_not_found"), flash[:alert] + end + test "cannot create a message if AI is disabled" do @user.update!(ai_enabled: false)