I've mendapat pertanyaan yang cukup sederhana. Tapi belum't menemukan solusi sejauh ini.
Jadi di sini's JSON string saya kirim ke server:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Menggunakan izin baru metode, aku've punya:
params.require(:measurement).permit(:name, :groundtruth)
Ini melempar tidak ada kesalahan, tapi database yang dibuat entri berisi null
bukan groundtruth nilai.
Jika saya hanya mengatur:
params.require(:measurement).permit!
Semuanya mendapatkan's diselamatkan seperti yang diharapkan, tapi tentu saja, ini membunuh keamanan yang disediakan oleh parameter kuat.
I've ditemukan solusi, bagaimana untuk mengizinkan array, tapi tidak satu contoh menggunakan bersarang benda-benda. Ini harus mungkin entah bagaimana, karena itu harus cukup umum use case. Jadi, bagaimana cara kerjanya?
Aneh seperti suara ketika anda ingin mengizinkan bersarang atribut yang anda lakukan menentukan atribut-atribut dari objek bersarang di dalam array. Dalam kasus anda itu akan
Update seperti yang disarankan oleh @RafaelOliveira
params.require(:measurement)
.permit(:name, :groundtruth => [:type, :coordinates => []])
Di sisi lain jika anda ingin bersarang dari beberapa objek maka anda membungkusnya di dalam hash seperti ini...
params.require(:foo).permit(:bar, {:baz => [:x, :y]})
Rel yang benar-benar memiliki cukup dokumentasi yang baik tentang hal ini: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Untuk penjelasan lebih lanjut, anda bisa melihat pelaksanaan izin
dan strong_parameters
itu sendiri: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247
Saya menemukan saran ini berguna dalam kasus saya:
def product_params
params.require(:product).permit(:name).tap do |whitelisted|
whitelisted[:data] = params[:product][:data]
end
end
Cek ini link dari Xavier's komentar di github.
Pendekatan ini whitelist seluruh params[:pengukuran][:groundtruth] objek.
Menggunakan pertanyaan asli atribut:
def product_params
params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
whitelisted[:groundtruth] = params[:measurement][:groundtruth]
end
end