Загрузка тегов со специальными символами через CSV не работает

Привет! Я пытаюсь загрузить CSV-файл с множеством тегов, но каждый раз получаю сообщение об ошибке: «Извините, произошла ошибка при загрузке файла. Пожалуйста, попробуйте снова».

В логах административной панели указано:

Сообщение (8 записей)

Не удалось корректно обработать перехваченный ответ: Ошибка валидации: Имя некорректно

Трассировка стека

/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/validations.rb:80:in `raise_validation_error'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/validations.rb:53:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:318:in `block in save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:375:in `block in with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/connection_adapters/abstract/database_statements.rb:278:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:212:in `transaction'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:366:in `with_transaction_returning_status'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/transactions.rb:318:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/suppressor.rb:48:in `save!'
/var/www/discourse/vendor/bundle/ruby/2.6.0/gems/activerecord-6.0.3.1/lib/active_record/persistence.rb:55:in `create!'

Я также попробовал создать тестовый тег (например, просто одну запись в CSV-файле — слово java), но получил ту же ошибку.

Кстати, я установил Discourse на DigitalOcean согласно официальному руководству по установке, и всё остальное работает корректно.

Спасибо!

Можем ли мы воспроизвести это в понедельник @tshenry?

Спасибо, @codinghorror — обязательно дайте знать, если что-то найдёте. Для справки: я использую версию 2.5.0.beta7 ( 14dc6f350e ) на Droplet с 4 ГБ ОЗУ и SSD объёмом 80 ГБ.

Кроме того, я установил плагины akismet, formatting-toolbar и discourse-voting.

Я только что протестировал это на try.discourse.org. Я создал простой текстовый редактор CSV-файл под названием tags.csv, содержащий только слово java, и смог использовать инструмент массовой загрузки тегов для добавления нового тега без проблем.

Сайт try.discourse.org использует Akismet и Discourse-voting, и я крайне сомневаюсь, что плагин formatting-toolbar мог бы конфликтовать каким-либо образом, приводящим к ошибке, которую вы видите.

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

Привет, @tshenry — да, я могу загружать изображения в свои сообщения, если именно это вы имели в виду.

Я удалил дроплет, заново установил Discourse и использую только следующие плагины.

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

На этот раз я использую версию 2.5.0.beta7 ( 70e50a2255 ).

Дайте знать, если хотите, чтобы я попробовал что-то ещё. Спасибо!

Ага — я нашёл кое-что интересное @codinghorror @tshenry.

Если файл тегов назван tags-1.csv, то возникает ошибка при загрузке. Если же назвать файл tags.csv, то загрузка тегов проходит успешно :slight_smile:

Это требование к именованию, которое нужно для Discourse (а я просто пропустил это в документации), или, возможно, это баг?

Хм, я попробовал переименовать свой файл в tags-1.csv, но всё равно не смог воспроизвести ошибку. Если вы вернёте его обратно к tags-1.csv и попробуете загрузить, ошибка появится снова? Мне интересно, не было ли в вашем исходном имени файла чего-то ещё, что мешало, и переименование в tags.csv как-то решило проблему.

Нет, у меня всё ещё не работает. На моём Mac я делаю следующее:

$ vi tags-1.csv

Затем
i для входа в режим редактирования
java
esc для выхода из режима редактирования
:wq и Enter для сохранения и выхода.

Всё. Это тоже не работает. Сначала я подумал, что проблема может быть связана с экспортом Excel в CSV, но даже редактирование через командную строку вызывает ошибки.

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

Спасибо @tshenry.

Я вижу ещё одну проблему (снова не уверен, связана ли она с моей средой).

Мои теги — это список языков программирования. В этом списке были C++ и C#, и как только я удалил их из файла tags.csv, массовая загрузка прошла успешно. Интересно, связано ли это с тем, что тег заканчивается специальным символом. Снова, возможно, это только у меня :man_shrugging:

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

Да! Это точно проблема. Я думал, что мы работаем только со словом java в файле, судя по вашему последнему сообщению. Вам нужно использовать что-то вроде cpp, c-sharp и т.д.

Да, я думаю, это было бы идеально. Текущая ошибка не дает пользователю почти никакой информации:

Произошла ошибка при загрузке файла. Пожалуйста, попробуйте снова.

Интересный момент, о котором я не знал: при попытке создать тег в обычных контекстах создания или редактирования темы, похоже, мы просто тихо удаляем все символы. Таким образом, ввод C++ предложит тег C.

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

На мой взгляд, быстрый способ — добавить несколько предложений в раздел «Теги» в настройках администратора, описывающих ограничения на имена тегов.

Также, возможно, стоит добавить предупреждение в руководство по тегам Discourse (Admin guide to tags in Discourse).

Да, это, похоже, именно так. Я нашел место в коде загрузки тегов, где выбрасывается общая ошибка, поэтому попробую создать более конкретную ошибку для этого случая в рамках pull-запроса.