params.expect в Rai...
 
Уведомления
Очистить всё

params.expect в Rails 8: переписывать все require.permit или не трогать?

4 Сообщения
3 Пользователи
2 Реакции
302 Просмотры
tatiana.golubeva
Сообщения: 5
Автор темы
Дружит с bundler бэкенд-разработчица
Присоединился: 1 год назад
[#82]

Пришла в Rails из Go, на проекте полгода, Rails 8.0 и Minitest. Новые контроллеры генератор теперь создаёт с params.expect, а во всём старом коде require(...).permit(...). Тимлид сказал «как хочешь», а я не понимаю, есть ли разница, кроме синтаксиса. Стоит ли переписывать старые контроллеры?


3 ответа
Егор64
Сообщения: 30
Читает чужие PR тимлид
Присоединился: 3 года назад

Разница есть, и не только в синтаксисе. Если кто-то пришлёт article=строка вместо хеша, require(:article).permit упадёт с NoMethodError на строке, и наружу уйдёт 500. expect в этом случае бросает ParameterMissing, клиент получает 400, а в трекере ошибок становится меньше мусора от ботов, которые шлют что попало.


Ответ
Валерий40
Сообщения: 33
Читает чужие PR фулстек-разработчик
Присоединился: 4 года назад

Ещё 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», двойные скобки их тоже понимают. Я бы переписывал не разом, а когда трогаешь контроллер по задаче, и сразу с тестом на вложенные атрибуты.


Ответ
tatiana.golubeva
Сообщения: 5
Автор темы
Дружит с bundler бэкенд-разработчица
Присоединился: 1 год назад

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


Ответ