Даниил!
Мы не используем ничего готового, потому что не нашли решений, подходящих к нашей задаче. Во‑первых, школьные тесты не показывают правильные и неправильные ответы, но красят в красный вопросы, в которых студент допустил ошибку. Во‑вторых, тесты обновляются и изменяются, не ломая предыдущие сдачи: если студент сдал предыдущую версию теста, то её и нужно оценивать и показывать. В‑третьих, под капотом тесты используют тот же движок, что и сайт: было бы мучительно использовать для тестов не Джейд (Паг), а XML или JSON.
Школьный тест — это набор вопросов, внутри которых есть текстовые или графические ответы. Каждый вопрос и ответ автоматически получают идентификатор, который зависит от текста вопроса и состава ответов: если вопрос или ответы изменятся, поменяются и их идентификаторы. Под капотом — это тот же Джейд (Паг) и Карандашик:
Когда автор публикует тест, бэкенд сохраняет его копию, компилирует и парсит тест, сохраняя в базу данных всё, что нужно, чтобы оценить сдачу:
ревизию теста,
текст и идентификаторы вопросов,
идентификаторы правильных и неправильных ответов.
Соответственно, сдача — это:
набор идентификаторов ответов, которые выбрал студент,
тест,
студент,
поток (например, «1 ступень 13 набора»),
дата сдачи,
дедлайн,
итоговый балл.
Когда студент открывает тест, бэкенд ищет подходящую ревизию: если студент уже сдавал тест, берём эту версию; если ещё нет — последнюю опубликованную. Когда ревизия найдена, бэкенд компилирует тест в ХТМЛ с ограничениями: вырезает комментарии автора, в которых могут быть намёки или пояснения, и информацию о правильных ответах.
Если студент открывает уже сданный тест, бэкенд подсовывает информацию о сдаче: когда сдан тест, сколько набрано баллов, в каких вопросах были допущены ошибки, что сейчас можно делать с тестом. Эту информацию использует фронтенд, чтобы «подкрасить» вопросы с ошибками и показать результаты теста.
В результате получается чёткое разделение ответственности: бэкенд хранит сдачи, оценки и тесты, а фронтенд только показывает данные, которые ему предоставил бэкенд, ничего не зная о правильных ответах.
P. S. Говоря о школьных тестах, нельзя не упомянуть читерство — списывание или совместную работу над тестами. С этой проблемой борется отдельная система мониторинга, которая использует как статистический, так и поведенческий анализ для выявления подозрительных сдач. К сожалению, эта система в несколько раз больше, чем весь бэкенд и фронтенд тестов: бороться с читингом сложнее и дороже, чем проверять знания тестами.
P. P. S. Это был совет о веб‑разработке. Хотите знать всё о коде, тестах, фронтенд‑разработке, цеэсэсе, яваскрипте, рельсах и джейде? Присылайте вопросы.