Saya punya pertanyaan yang cukup sederhana. Namun sejauh ini belum menemukan solusi.
Jadi inilah string JSON yang saya kirim ke server:
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
Menggunakan metode izin baru, saya punya:
params.require(:measurement).permit(:name, :groundtruth)
Ini tidak menimbulkan kesalahan, tetapi entri basis data yang dibuat mengandung null
bukan nilai groundtruth.
Jika saya hanya mengatur:
params.require(:measurement).permit!
Semuanya bisa diselamatkan seperti yang diharapkan, tapi tentu saja, ini membunuh keamanan yang diberikan oleh parameter kuat.
Saya telah menemukan solusi, cara mengizinkan array, tetapi tidak satu contoh pun menggunakan objek bersarang. Ini pasti mungkin entah bagaimana, karena itu harus menjadi kasus penggunaan yang cukup umum. Jadi, bagaimana cara kerjanya?
Jawaban:
Seaneh kedengarannya ketika Anda ingin mengizinkan atribut bersarang Anda menentukan atribut objek bersarang dalam array. Dalam kasus Anda itu akan menjadi
Perbarui seperti yang disarankan oleh @RafaelOliveira
Di sisi lain jika Anda ingin bersarang dari banyak objek maka Anda membungkusnya di dalam hash ... seperti ini
Rails sebenarnya memiliki dokumentasi yang cukup bagus tentang ini: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit
Untuk klarifikasi lebih lanjut, Anda dapat melihat implementasi
permit
danstrong_parameters
sendiri: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247sumber
Saya menemukan saran ini berguna dalam kasus saya:
Periksa tautan komentar Xavier ini di github.
Pendekatan ini membuat daftar putih seluruh params [: pengukuran] [: groundtruth] objek.
Menggunakan atribut pertanyaan asli:
sumber
permit!
untuk masuk daftar putih atau tetap tidak diijinkan setelah mengetuknya. Dalam hal ini akan menjadiparams[:measurement][:groundtruth].permit!
permit!
menimbulkanNoMethodError (undefined method
izin kesalahan ini ! ' untuk # <Array: 0x007f80cb71ea00>): `permit!
Metode @wuliwong tidak tersedia diArray
. Anda harus memiliki akses ke instance kelas masing-masing untuk memiliki aksespermit!
(sudah lama jadi saya sudah lupa nama kelas tapi itu sepertiActionController::Parameters
berdasarkan halaman ini ).Mengizinkan objek bersarang:
sumber
Jika Rails 5, karena notasi hash baru:
params.permit(:name, groundtruth: [:type, coordinates:[]])
akan berfungsi dengan baik.sumber