Rel 4 - Kuat Parameter - Bersarang Benda

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?

Mengomentari pertanyaan (3)
Larutan

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

Komentar (4)

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
Komentar (4)

Memungkinkan sebuah objek bersarang :

params.permit( {:school => [:id , :name]}, 
               {:student => [:id, 
                            :name, 
                            :address, 
                            :city]},
                {:records => [:marks, :subject]})
Komentar (0)

Jika Rel 5, karena baru hash notasi: params.izin(:nama, groundtruth: [:jenis, koordinat:[]]) akan bekerja dengan baik.

Komentar (0)