Больше нельзя создавать новые аккаунты из-за старого плагина multi-select user field

По какой-то причине кнопка «Создать учётную запись» больше не работает в диалоге регистрации на моём форуме — после заполнения всех полей пользователя (насколько я могу судить, корректно) нажатие на неё не вызывает никакой реакции (даже сообщения об ошибке).

Диалоговое окно не закрывается, и письмо для подтверждения по электронной почте не отправляется.

В содержимом полей пользователя во время регистрации очевидных проблем не обнаружено — все поля заполнены, и ни одно не показывает ошибок.

Тестирование проводилось в Chrome версии 117.0.5938.134 (официальная сборка) и в Edge версии 118.0.2088.33 (официальная сборка).

Очистка кэша браузера, похоже, не даёт никакого эффекта.

Функция ручной «тестовой отправки письма» успешно отправляет сообщение на адрес затронутого пользователя.

Функция рассылки писем на форуме для существующих пользователей работает без проблем.

Я также могу без проблем войти в веб-сайт форума и выйти из него.

Мне неизвестно о каких-либо недавних изменениях в настройках форума (кроме обновлений программного обеспечения), но я не уверен, существует ли вообще настройка «игнорировать ввод пользователя».

Пользователь, который хочет зарегистрироваться, уже несколько раз пытался создать учётную запись, и я также пробовал со своей стороны, что позволяет подтвердить наличие проблемы.

В настоящее время используется последняя версия Discourse (обновлена до сборки 3.2.0.beta2-dev в надежде решить проблему).

Не уверен, когда именно это началось, так как у нас давно не было новых регистраций (возможно, теперь я знаю почему!)

Вы видите какие-либо ошибки в консоли браузера? Установлены ли у вас (или у пользователя) блокировщики контента или рекламы в браузере?

Хорошая мысль.

Да, в браузере Edge я вижу ошибки и предупреждения.

Не совсем понимаю, что это означает — значит ли это, что плагин Multi-select несовместим с последней версией Discourse?

К сожалению, этот плагин критически важен во время регистрации — он используется для заполнения определённых полей профиля пользователей из выпадающих списков.

Я бы попробовал временно отключить плагин, чтобы изолировать проблему.

Если проблема вызвана плагином Multi-select, то миграция старых полей ‘multiselect-dropdown’ на новые поля Discourse ‘multiselect’ должна быть довольно простой. Кто-то из сообщества Discourse сможет помочь вам с этим.

[PLUGIN discourse-multiselect-user-field] "model:user-field" не был найден через modifyClass

Но…

РЕДАКТИРОВАНИЕ: Саймон опередил меня.

Привет — да, похоже, что этот плагин устарел и, скорее всего, больше не будет обновляться. Однако проблема заключается в миграции данных пользователей, сгенерированных плагином, в соответствующие поля данных основных пользователей, чтобы плагин можно было безопасно удалить.

Простое удаление плагина также, похоже, удаляет связанные данные (или, по крайней мере, они больше не видны при просмотре профилей пользователей).

Предполагая, что я не единственный пользователь этого плагина, было бы здорово, если бы для него выпустили финальное обновление, включающее функцию «Миграция»!

В коде плагина я не вижу ничего, что могло бы привести к удалению полей пользователей, созданных через него, из базы данных при удалении плагина с сайта. Ожидается, что в консоли Rails выполнение команды:

UserField.where(field_type: 'multiselect-dropdown')

вернет список полей типа multiselect-dropdown, созданных на вашем сайте.

Значения id каждого из этих полей можно использовать для поиска вариантов, которые выбрал каждый пользователь на вашем сайте для соответствующего поля. Например, если возвращенные id — [1, 2, 3], то в базе данных будут соответствующие записи UserCustomField с именами "user_field_1", "user_field_2" и "user_field_3". Если всё верно, этой информации будет достаточно, чтобы кто-то мог перенести старые поля в новые через консоль Rails вашего сайта.

Если автор плагина не займется этим вопросом, вам, скорее всего, придется нанять кого-то для выполнения этой работы. Примечание: я не пытаюсь найти работу здесь, мне бы не хотелось этим заниматься :slight_smile:

Перед выполнением миграции следует создать новые поля типа ‘multiselect’ в Discourse, варианты которых соответствуют значениям ваших старых полей типа multiselect-dropdown. Чтобы упростить процесс миграции, рекомендуется использовать для новых полей те же имена, что и для старых. Так тот, кто будет выполнять миграцию, поймет, что (например) поля типа multiselect-dropdown с именем “NZRAB number” должны быть перенесены в новое поле типа ‘multiselect’ с тем же именем “NZRAB number”.

Я согласен, что лучше всего, если автор плагина решит эту проблему, но если это невозможно, просто создайте новые поля типа ‘multiselect’ и удалите плагин.

Спасибо, Саймон.

Просто уточню: должна ли базовая версия раскрывающегося списка с множественным выбором позволять пользователю выбирать несколько элементов из одного списка одновременно, как это делал старый плагин?

Когда я попытался добавить новое поле пользователя типа «Раскрывающийся список с множественным выбором», доступно только один вариант выбора «Раскрывающийся список с множественным выбором» (я, возможно, ожидал два варианта, если версия плагина отличается от базовой версии).

Теперь, если я выберу этот тип поля «Раскрывающийся список с множественным выбором» и попробую добавить данные в профиль пользователя, он принимает только один выбор пользователя, а не несколько выборов одновременно. Таким образом, кажется, что либо базовая версия типа поля «Раскрывающийся список с множественным выбором» имеет сниженный функционал и вытеснила версию поля плагина, либо существует какое-то взаимодействие с версией плагина, которое ограничивает функциональность той версии, которую я вижу?

Я думаю, что да, но я не пробовал плагин множественного выбора, поэтому не могу быть уверен. Вот как работают поля множественного выбора в Discourse:

Пользователи могут выбирать любые элементы, которые вы добавляете при настройке пользовательского поля:

Возможно, интерфейс отличается от того, что делал плагин, но надеюсь, что результаты будут теми же.

Можете ли вы подтвердить, что при установленном плагине вы можете видеть значения, которые пользователи ввели для полей, созданных с помощью плагина, если зайдёте на их страницу профиля?

Редактирование: @Paul_King, я понимаю, что, возможно, был слишком оптимистичен насчёт миграции данных. Без доступа к консоли Rails вашего сайта самый простой способ понять, что происходит, — это проверить, как были сохранены старые поля, выполнив запрос в Data Explorer. Если у вас на сайте не установлен этот плагин, возможно, стоит его добавить.

Если на вашем сайте установлен плагин Data Explorer, попробуйте выполнить следующий запрос:

SELECT * FROM user_fields

Надеюсь, этот запрос вернёт результаты, где поле field_type установлено в значение “multiselect-dropdown”. Если это так, миграция данных должна быть довольно простой.

Спасибо, Саймон.

Ваш пример работы выпадающего списка с множественным выбором совпадает с тем, как работал мой раньше, что выглядит многообещающе с точки зрения восстановления исходной функциональности.

В настоящее время кажется, что ни старый плагин, ни функциональность ядра новой версии не работают корректно: всё поле теперь вообще не отображается на экране редактирования профиля пользователя, хотя значения, которые пользователь изначально ввёл с помощью старого плагина, появляются при клике на аватар другого пользователя, но с исходными данными, показанными в квадратных скобках и кавычках по краям.

Да, этот запрос действительно возвращает этот тип поля. Возможно, путаница возникает из-за того, что название старого плагина и название в ядре Discourse для их соответствующих версий типа поля пользователя с множественным выбором идентичны?

Это неудивительно. Это означает, что данные, необходимые для миграции, находятся в базе данных, но, похоже, они представлены в форме, которая не позволит провести миграцию так легко, как я надеялся.

Чтобы это подтвердить, попробуйте выполнить следующий запрос в Data Explorer:

SELECT * FROM user_custom_fields
WHERE name = 'user_field_1'
ORDER BY user_id

Полезная информация из результатов этого запроса будет содержаться в столбце value. В идеале результаты должны выглядеть примерно так, с отдельной записью для каждого варианта, выбранного пользователем:

Я подозреваю, что вы обнаружите, что значения для каждого выбранного пользователем варианта будут находиться в одной и той же строке. Например, [this, that] или "[this, that]". Если это так, пожалуйста, опубликуйте несколько примеров записей значений.

Возможно, потребуется немного проб и ошибок, чтобы понять, как преобразовать значения в формат, ожидаемый Discourse.

Думаю, экспорт файла пользователя предоставит все необходимые данные, и его можно будет очистить, чтобы подготовить к импорту, используя что-то вроде этого:

Похоже, что это сработает. Скорее всего, для выполнения этой работы потребуется нанять Джейя или кого-то похожего.

Также технически возможно внести изменения через консоль Rails. Сложность такого подхода будет зависеть от того, как устанавливаются поля value для старых пользовательских полей типа “multiselect-dropdown”. Если в каждой строке хранится один вариант, то создание новых записей UserCustomField на основе старых будет straightforward. Если же в каждой строке хранится несколько вариантов, это может оказаться довольно запутанным.

Ему повезло, что я живу совсем рядом :wink:.

Формат данных был интересным — он существовал в двух разных видах, которые однажды изменились. Изначально они выглядели так:

this
that

А в один день внезапно превратились в:

this,that

Мне пришлось проделать кое-какую грязную работу в электронных таблицах, чтобы преобразовать данные в формат, соответствующий новым полям с множественным выбором (как показано выше). К сожалению, скрипт пока не умеет работать с множественным выбором. Кто-нибудь готов сделать pull request?

Хотя я думаю, что могу обойти это ограничение или взломать систему, чтобы выполнить задачу:

Первый проход: все пользователи с одним значением с использованием существующего скрипта.
Второй проход: все пользователи с несколькими значениями с использованием модифицированного скрипта, который принудительно создает новые строки.

позже…
Мой хитрый план сработал.

Вот модифицированный скрипт для второго прохода:

# frozen_string_literal: true

require "csv"
desc "Импорт пользовательских полей"
task "multi_user_fields:import_csv", [:filename] => [:environment] do |_, args|

  puts "Имя файла: #{args[:filename]}"
  data = CSV.read(args[:filename], headers: true );

  data.each_entry do |row|
    puts "Обработка строки."
    row.to_h.each do |x|
      user_id = row['user_id']
      if x.first == 'user_id'
        u = User.find(user_id)
        puts "Найден пользователь: #{u.username}"
      else
        name = x.first
        val = row[x.first]
        ucf = UserCustomField.find_by(user_id: row['user_id'], name: name)
          if val
            puts "Создание UCF: #{row['user_id']} Имя: #{name}, значение: #{val}"
            UserCustomField.create(user_id: user_id, name: name, value: val)
          end
      end
    end
  end
end

@pfaffman — насколько сложно будет обновить сам скрипт, чтобы он поддерживал поля с множественным выбором для тех, кто в будущем будет работать с пользовательскими полями (UCF)?

С моей стороны я с большим удовольствием сообщаю, что Натан и его процесс (включая все хаки) действительно сработали.

Я подтвердил, что диалоговое окно регистрации теперь работает: пользователи, желающие зарегистрироваться, снова могут выбирать несколько вариантов из выпадающего списка, а одобренные пользователи могут просматривать и редактировать свой выбор. Кроме того, старый плагин для множественного выбора был успешно удалён.

Благодарю @nathank, @omarfilip, @simon и @RGJ за уделенное время, рассмотрение этой проблемы и обмен знаниями и идеями — это ещё одно доказательство (если оно вообще было нужно) того, насколько замечательным является наше сообщество!