From 5a1dc81ada633a59c6c3fe5ef7f5b069d0d07417 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 12:32:22 +0000 Subject: [PATCH 1/2] Fix support ticket priority ArgumentError on create The priority select posted integer enum values as strings ("2"), which Rails rejects as invalid keys. Submit enum names from the form, keep integer values for the Ransack filter, and validate the enum so bad priorities become form errors instead of a 500. Co-authored-by: Thibaud Guillaume-Gentil --- app/admin/support/ticket.rb | 2 +- app/helpers/support_helper.rb | 12 ++++-- app/models/support/ticket.rb | 2 +- .../support_tickets_controller_test.rb | 40 +++++++++++++++++-- test/models/support/ticket_test.rb | 22 ++++++++++ 5 files changed, 70 insertions(+), 8 deletions(-) diff --git a/app/admin/support/ticket.rb b/app/admin/support/ticket.rb index 0c8899686..dec32bfa3 100644 --- a/app/admin/support/ticket.rb +++ b/app/admin/support/ticket.rb @@ -26,7 +26,7 @@ collection: -> { ticket_admins_collection(collection) }, label: -> { Support::Ticket.human_attribute_name(:admin) } filter :priority, as: :select, - collection: -> { ticket_priority_marks_collection } + collection: -> { ticket_priority_filter_collection } filter :last_activity_at, as: :date_range includes :admin, :last_message diff --git a/app/helpers/support_helper.rb b/app/helpers/support_helper.rb index 6e102079e..f5f98282d 100644 --- a/app/helpers/support_helper.rb +++ b/app/helpers/support_helper.rb @@ -12,12 +12,18 @@ def ticket_admins_collection(relation = nil) def ticket_priority_marks_collection [ - [ "", Support::Ticket.priorities[:normal] ], - [ Support::Ticket::PRIORITY_ICONS[:medium], Support::Ticket.priorities[:medium] ], - [ Support::Ticket::PRIORITY_ICONS[:high], Support::Ticket.priorities[:high] ] + [ "", :normal ], + [ Support::Ticket::PRIORITY_ICONS[:medium], :medium ], + [ Support::Ticket::PRIORITY_ICONS[:high], :high ] ] end + def ticket_priority_filter_collection + ticket_priority_marks_collection.map { |label, key| + [ label, Support::Ticket.priorities[key] ] + } + end + def support_message_html(message) html = if message.html.present? message.html.to_s diff --git a/app/models/support/ticket.rb b/app/models/support/ticket.rb index 10a2021e2..579d22b70 100644 --- a/app/models/support/ticket.rb +++ b/app/models/support/ticket.rb @@ -10,7 +10,7 @@ class Ticket < ApplicationRecord include HasAttachments has_rich_text :html - enum :priority, %i[normal medium high] + enum :priority, %i[normal medium high], validate: true belongs_to :admin, optional: true has_many :messages, class_name: "Support::Message", diff --git a/test/controllers/support_tickets_controller_test.rb b/test/controllers/support_tickets_controller_test.rb index 47b321621..c4cdae580 100644 --- a/test/controllers/support_tickets_controller_test.rb +++ b/test/controllers/support_tickets_controller_test.rb @@ -110,9 +110,9 @@ def login(admin) assert_select "label[for=support_ticket_priority]", count: 0 assert_select "#support_ticket_subject_input .inline-hints", count: 0 assert_select "select[name='support_ticket[priority]']" do - assert_select "option[value=?]", Support::Ticket.priorities[:normal], text: "" - assert_select "option[value=?]", Support::Ticket.priorities[:medium], text: Support::Ticket::PRIORITY_ICONS[:medium] - assert_select "option[value=?]", Support::Ticket.priorities[:high], text: Support::Ticket::PRIORITY_ICONS[:high] + assert_select "option[value=?]", "normal", text: "" + assert_select "option[value=?]", "medium", text: Support::Ticket::PRIORITY_ICONS[:medium] + assert_select "option[value=?]", "high", text: Support::Ticket::PRIORITY_ICONS[:high] end post support_tickets_path, params: { @@ -145,6 +145,40 @@ def login(admin) assert_equal "Checkout fails", ticket.messages.first.body end + test "create accepts high priority from the form enum name" do + login admins(:external) + + post support_tickets_path, params: { + support_ticket: { + priority: "high", + subject: "Broken shop", + html: "
Checkout fails
" + } + } + + ticket = Support::Ticket.order(:id).last + assert_redirected_to support_ticket_path(ticket) + assert_equal "high", ticket.priority + end + + test "create with a numeric priority string re-renders instead of raising" do + login admins(:external) + + assert_no_difference "Support::Ticket.count" do + post support_tickets_path, params: { + support_ticket: { + priority: "2", + subject: "Broken shop", + html: "
Checkout fails
" + } + } + end + + assert_response :unprocessable_entity + assert_select "#support_ticket_priority_input.error" + assert_includes response.body, I18n.t("errors.messages.inclusion") + end + test "show includes the thread and reply box" do ticket = Support::Ticket.create!( priority: :normal, subject: "Need help", content: "Opening", admin: admins(:external)) diff --git a/test/models/support/ticket_test.rb b/test/models/support/ticket_test.rb index 631e208fa..b983899df 100644 --- a/test/models/support/ticket_test.rb +++ b/test/models/support/ticket_test.rb @@ -3,6 +3,28 @@ require "test_helper" class Support::TicketTest < ActiveSupport::TestCase + test "invalid priority is a validation error instead of ArgumentError" do + ticket = Support::Ticket.new( + priority: "2", + subject: "Test", + content: "Test", + admin: admins(:external)) + + assert_not ticket.valid? + assert_includes ticket.errors[:priority], I18n.t("errors.messages.inclusion") + end + + test "priority accepts enum names" do + ticket = Support::Ticket.new( + subject: "Test", + content: "Test", + admin: admins(:external)) + + ticket.priority = "high" + assert ticket.high? + assert ticket.valid? + end + test "subject_decorated" do ticket = Support::Ticket.new( priority: :normal, From c74a4f6bb084f7d0429f68995197835b4974aa59 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Sun, 13 Sep 2026 12:36:21 +0000 Subject: [PATCH 2/2] Keep the priority select optional in HTML enum validate: true marks priority as required, and Rails then rejects include_blank: false on the select. The model still validates inclusion; the input stays a compact mark picker with a default of normal. Co-authored-by: Thibaud Guillaume-Gentil --- app/admin/support/ticket.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/app/admin/support/ticket.rb b/app/admin/support/ticket.rb index dec32bfa3..3c029af76 100644 --- a/app/admin/support/ticket.rb +++ b/app/admin/support/ticket.rb @@ -89,6 +89,7 @@ f.input :priority, collection: ticket_priority_marks_collection, include_blank: false, + required: false, label: false, wrapper_html: { class: "support-ticket-priority" }, input_html: {