Пришла в Rails из Go, на проекте полгода, Rails 8.0 и Minitest. Новые контроллеры генератор теперь создаёт с params.expect, а во всём старом коде require(...).permit(...). Тимлид сказал «как хочешь», а я не понимаю, есть ли разница, кроме синтаксиса. Стоит ли переписывать старые контроллеры?
Разница есть, и не только в синтаксисе. Если кто-то пришлёт article=строка вместо хеша, require(:article).permit упадёт с NoMethodError на строке, и наружу уйдёт 500. expect в этом случае бросает ParameterMissing, клиент получает 400, а в трекере ошибок становится меньше мусора от ботов, которые шлют что попало.
Ещё expect строже с массивами, на этом легко споткнуться при переписывании. Было и стало:
# было
params.require(:order).permit(:comment, tag_ids: [], items_attributes: [:id, :quantity, :_destroy])
# стало
params.expect(order: [:comment, tag_ids: [], items_attributes: [[:id, :quantity, :_destroy]]])
Для массива хешей нужны двойные скобки. С одинарными expect ждёт один хеш, вложенные позиции молча отфильтруются, и форма сохранится без них. Вложенные атрибуты из формы приходят хешем с ключами «0», «1», двойные скобки их тоже понимают. Я бы переписывал не разом, а когда трогаешь контроллер по задаче, и сразу с тестом на вложенные атрибуты.
За двойные скобки спасибо, у нас как раз заказы с вложенными позициями. Решили переписывать по ходу задач, первый контроллер уже переехал вместе с тестом