При исследовании Private Topics Plugin - #109 by thoka я обнаружил, что упоминание пользователя в ограниченной категории не фиксируется, если имя пользователя содержит заглавные буквы.
Если я упоминаю @SomeUser, редактор отправляет запрос /composer/mentions.json?names[]=SomeUser&topic_id=10728,
и в результате возвращается имя пользователя в нижнем регистре, без установки user_reasons.
Запрос имени пользователя в нижнем регистре возвращает "user_reasons": {"someuser":"category"}.
Если в редакторе использовать имена пользователей в нижнем регистре, будут отображаться предупреждения для пользователей с недостаточными правами.
Если использовать автодополнение, предоставляемое редактором, введённые имена в нижнем регистре заменяются на имена с заглавными буквами, и поэтому они не фиксируются.
users возвращает {"username_lower" => объект User }.
Однако, если name не приведен к нижнему регистру, users[name] не существует.
Исправление:
if user = users[name.downcase]
...
elsif group = groups[name.downcase]
...
Или ещё лучше: приведите все имена к нижнему регистру в начале метода, так как там много проблем. groups корректно использует .where("lower(name) IN (?)", @names.map(&:downcase)), но функции visible_group_ids_for_allowed_check, topic_allowed_group_ids, mentionable_group_ids и members_visible_group_ids все используют where(name: @names), что также вносит проблемы с чувствительностью к регистру.