Eu tenho uma pergunta bem simples. Mas ainda não encontrei uma solução.
Então, aqui está a string JSON que eu envio ao servidor:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Usando o novo método de permissão, eu tenho:
params.require(:measurement).permit(:name, :groundtruth)
Isso não gera erros, mas a entrada do banco de dados criada contém, em null
vez do valor de groundtruth.
Se eu apenas definir:
params.require(:measurement).permit!
Tudo é salvo como esperado, mas é claro que isso mata a segurança fornecida por parâmetros fortes.
Encontrei soluções, como permitir matrizes, mas não um único exemplo usando objetos aninhados. Isso deve ser possível de alguma forma, pois deve ser um caso de uso bastante comum. Então, como isso funciona?
Respostas:
Por mais estranho que pareça quando você deseja permitir atributos aninhados, você especifica os atributos do objeto aninhado em uma matriz. No seu caso, seria
Atualizar como sugerido por @RafaelOliveira
Por outro lado, se você deseja aninhar vários objetos, envolva-o em um hash ... assim
Os Rails realmente têm uma documentação muito boa sobre isso: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Para esclarecimentos adicionais, você pode examinar a implementação
permit
estrong_parameters
ela própria: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247fonte
Achei esta sugestão útil no meu caso:
Verifique este link do comentário de Xavier no github.
Essa abordagem coloca na lista de permissões todo o objeto de parâmetros [: measure] [: groundtruth].
Usando os atributos de perguntas originais:
fonte
permit!
para estar na lista de permissões, caso contrário ele permanecerá não permitido depois de tocar nele. Neste caso, seriaparams[:measurement][:groundtruth].permit!
permit!
aumenta essaNoMethodError (undefined method
permissão de erro ! ' for # <Array: 0x007f80cb71ea00>): `permit!
método @wuliwong não está disponível emArray
. Você precisará ter acesso à respectiva instância de classe para ter acessopermit!
(já faz algum tempo, esqueci o nome da classe, mas é algoActionController::Parameters
baseado nesta página ).Permitindo um objeto aninhado:
fonte
Se for o Rails 5, por causa da nova notação de hash:
params.permit(:name, groundtruth: [:type, coordinates:[]])
funcionará bem.fonte