2013-07-16 11 views
15

mam to w moim kontrolera:Jak utworzyć opcjonalny klucz o silnych parametrach, a mimo to filtrować zagnieżdżone w nim params?

params.require(:item).permit! 

Przyjmijmy tę rspec specyfikację:

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

To działa zgodnie z oczekiwaniami, nie błąd. Jednakże, jeśli mogę użyć tego:

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

mam ActionController::ParameterMissing który nie chce się dostać. Ma to związek z makrami kontrolera, których używam do innych akcji i przez które nie mogę kontrolować wysyłanych parametrów (makra sprawdzają poświadczenia użytkownika, więc nie obchodzi mnie właściwie testowanie akcji #update, raczej po prostu testuję before_filters dla tego).

Moje pytanie brzmi: w jaki sposób mogę uczynić params[:item] opcjonalną, ale nadal filtrować atrybuty w nim, jeśli jest obecny?

+4

kilka dobrych pomysłów na https://github.com/rails/rails/issues/9534. Zasadniczo sugeruje się użycie '# fetch' zamiast' # require', ponieważ ma on drugi parametr domyślny, np .: 'params.fetch (: item, {}). Permit!'. – mtjhax

+0

@mtjhax niesamowite, thx! na które warto byłoby udzielić odpowiedzi. – srecnig

Odpowiedz

25

Co o:

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

Nie można wymagać opcjonalny parametr. To jest sprzeczne.

Edycja: jak mtjhax wymienionego w swoim komentarzu, jest rada od here używać fetch zamiast: params.fetch(:item, {}).permit!

+1

Myślę, że źle zrozumiałeś jego pytanie. Jest to całkowicie poprawne, aby chcieć wymagać głównego kontenera (: item), podczas gdy niektóre wewnętrzne atrybuty podrzędne są opcjonalne, oprócz użycia "params.require (: item) .permit!" (Który pozwala na dowolne parametry tak długie jak są one w ': item' i': item' istnieje nie wydaje się możliwe w sposób ziarnisty –

+0

@OlivierLacan czytając go z powrotem, myślę, że możesz być poprawny, chociaż jestem teraz zdezorientowany, dlaczego on przyjął moją odpowiedź, jeśli to nie rozwiązało jego problemu. –

Powiązane problemy