2013-04-26 14 views
5

Czy jest możliwe oznaczenie pojedynczego atrybutu skrótu zgodnie z wymaganiami przy użyciu mocnych parametrów?Silne parametry wymagające atrybutu

danego wejścia jak:

{ 
    "example" => { 
    "optional": 1234, 
    "required": 5678 
    } 
} 

Standardowe przykłady silnych params są:

params.require(:example).permit(:optional, :required)

Biorąc pod uwagę, że można wymagać pewnych parametrów, myślałem, że po będzie działać:

params.require(:example).require(:required) 
params.require(:example).permit(:optional) 

Podjęłam próbę:

params.require(:example => [ :required ]).permit(:optional) 
params.require(:example).permit(:optional) 
params[:example].require(:required) 

I wszystko, co mogę wymyślić.

Czy ktoś wie, czy jest to możliwe?

Odpowiedz

5

Greg!

Miałem to samo pytanie, ale ostatecznie stwierdziłem, że nie jest to właściwe pytanie.

Spójrz, oto kod źródłowy wymagają metody w strong_parameters gem:

def require(key) 
    self[key].presence || raise(ActionController::ParameterMissing.new(key)) 
end 

Tak, w zasadzie, nie ma sposobu, aby wymagać „wymagane” atrybut params hash. Ale spójrz na to z innej strony. Myślę, że lepiej napisać własną metodę wymagającą tego. Ponieważ używam szyn, właśnie dodałem model validates_presence_of. Jeśli chcesz, aby był dynamiczny, możesz utworzyć niestandardową weryfikację. Można znaleźć swoją dokumentację tutaj:

http://guides.rubyonrails.org/v3.2.13/active_record_validations_callbacks.html#performing-custom-validations

+0

Dzięki RunFor. Doszedłem do tego samego wniosku. W moim przypadku wymaganie dotyczące obecności jest uzależnione od sposobu, w jaki dostęp do zasobu jest uzyskiwany (np. Za pośrednictwem kontrolera), ale udało mi się wprowadzić warunkową weryfikację, aby pomóc w tym. –

0

Co możesz zrobić, to użyć

def example_params 
    params.require(:example) 
    params[:example].require(:required) 
    params.require(:example).permit(:required, :optional) 
end 

Pierwsza linia zawiedzie jeśli :example brakuje. Druga linia kończy się niepowodzeniem, jeśli brakuje :required z :example. Trzecia linia zwraca to, czego oczekujesz, jednocześnie zezwalając na :optional.

Powiązane problemy