2013-07-16 1 views
15

у меня есть это в мой контроллер:Как сделать необязательный сильный ключ параметров, но все еще фильтровать параметры, вложенные в него?

params.require(:item).permit! 

Давайте предположим, что этот Rspec спецификации:

put :update, id: @item.id, item: { name: "new name" } 

Он работает, как и ожидалось, не ошибка. Однако, если я использую это:

put :update, id: @item.id, item: nil 

я ActionController::ParameterMissing, которые я не хочу, чтобы получить. Это связано с макросами диспетчера, которые я использую для других действий, и через которые я не могу контролировать отправленные параметры (макросы проверяют учетные данные пользователя, поэтому мне действительно неинтересно проверять действие #update, а я просто тестирую before_filters для этого).

Так что мой вопрос: Как мне сделать params[:item] необязательно, но все еще фильтровать атрибуты внутри него, если он присутствует?

+4

Некоторые хорошие идеи на https://github.com/rails/rails/issues/9534. В принципе, рекомендуется использовать '# fetch' вместо' # require', поскольку у него есть второй параметр для значения по умолчанию, например: 'params.fetch (: item, {}). Allow!'. – mtjhax

+0

@mtjhax awesome, thx! что было бы целесообразно вставить в ответ. – srecnig

ответ

25

насчет:

params.require(:item).permit! if params[:item]

Вы не можете требовать дополнительный параметр. Это противоречиво.

Edit: а mtjhax говорил в своем комментарии, есть советы от here использовать fetch вместо: params.fetch(:item, {}).permit!

+1

Я думаю, вы неправильно поняли его вопрос. Совершенно верно, что нужно требовать основного контейнера (: item), но только для некоторых его внутренних вспомогательных атрибутов, которые помимо использования 'params.require (: item) .permit!' (Который разрешает любые параметры, пока они находятся внутри ': item' и': item' существует, не представляется возможным в гранулированном виде. –

+0

@OlivierLacan, читая его обратно, я думаю, что вы можете быть правы, хотя я теперь смущен, почему он принял мой ответ, если он не разрешил свою проблему. –

 Смежные вопросы

  • Нет связанных вопросов^_^