Как сделать необязательный ключ сильных параметров, но все еще фильтровать параметры, вложенные в него?
У меня это в контроллере:
params.require(:item).permit!
Предположим, что это спецификация rspec:
put :update, id: @item.id, item: { name: "new name" }
Он работает как ожидалось, без ошибок. Однако, если я использую это:
put :update, id: @item.id, item: nil
Я получаю ActionController::ParameterMissing
, который я не хочу получать. Это связано с макросами диспетчера, которые я использую для других действий, и через которые я не могу управлять передаваемыми параметрами (макросы проверяют учетные данные пользователя, поэтому мне действительно не нужно фактически тестировать действие #update
, а я просто test before_filters для него).
Итак, мой вопрос: как сделать params[:item]
необязательным, но все же фильтровать в нем атрибуты, если он присутствует?
Ответы
Ответ 1
Как насчет:
params.require(:item).permit! if params[:item]
Вы не можете потребовать дополнительный параметр. Это противоречиво.
Изменить: как упоминалось в его комментарии mtjhax, здесь здесь можно использовать fetch
вместо params.fetch(:item, {}).permit!