Mam dość proste pytanie. Ale do tej pory nie znalazłem rozwiązania.
Oto ciąg JSON, który wysyłam na serwer:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Korzystając z nowej metody zezwolenia, otrzymałem:
params.require(:measurement).permit(:name, :groundtruth)
Nie null
powoduje to żadnych błędów, ale utworzony wpis bazy danych zawiera zamiast wartości groundtruth.
Jeśli tylko ustawię:
params.require(:measurement).permit!
Wszystko jest zapisywane zgodnie z oczekiwaniami, ale oczywiście zabija to bezpieczeństwo zapewniane przez mocne parametry.
Znalazłem rozwiązania, jak zezwolić na tablice, ale ani jednego przykładu z użyciem obiektów zagnieżdżonych. To musi być jakoś możliwe, ponieważ powinien to być dość powszechny przypadek użycia. Więc jak to działa?
Odpowiedzi:
Choć brzmi to dziwnie, kiedy chcesz zezwolić na zagnieżdżone atrybuty, określasz atrybuty zagnieżdżonego obiektu w tablicy. W twoim przypadku tak by było
Zaktualizuj zgodnie z sugestią @RafaelOliveira
Z drugiej strony, jeśli chcesz zagnieżdżać wiele obiektów, umieszczasz je wewnątrz hasha… w ten sposób
Railsy mają całkiem niezłą dokumentację na ten temat: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
W celu uzyskania dalszych wyjaśnień, można spojrzeć na realizację
permit
istrong_parameters
sama: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247źródło
Ta sugestia okazała się przydatna w moim przypadku:
Sprawdź ten link do komentarza Xaviera na github.
To podejście tworzy białą listę całego obiektu params [: measurement] [: groundtruth].
Używając oryginalnych atrybutów pytań:
źródło
permit!
aby znaleźć się na białej liście, bo inaczej pozostało niedozwolone po dotknięciu. W tym przypadku byłoby toparams[:measurement][:groundtruth].permit!
permit!
zwiększaNoMethodError (undefined method
zezwolenie na błąd ! ' for # <Array: 0x007f80cb71ea00>): `permit!
Metoda @wuliwong nie jest dostępna wArray
. Będziesz musiał mieć dostęp do odpowiedniej instancji klasy, aby mieć dostęp dopermit!
(minęło trochę czasu, więc zapomniałem nazwy klasy, ale jest onaActionController::Parameters
oparta na tej stronie ).Zezwalanie na zagnieżdżony obiekt:
źródło
Jeśli jest to Rails 5, z powodu nowej notacji hash:
params.permit(:name, groundtruth: [:type, coordinates:[]])
będzie działać dobrze.źródło