Șine 4 - Puternic Parametri - Obiecte Imbricate

Am'am o întrebare destul de simplă. Dar am't a găsit o soluție până acum.

Deci, aici's JSON string-am trimite la server:

{
  "name" : "abc",
  "groundtruth" : {
    "type" : "Point",
    "coordinates" : [ 2.4, 6 ]
  }
}

Folosind noul permis de metoda, am'am:

params.require(:measurement).permit(:name, :groundtruth)

Acest lucru aruncă nici o eroare, dar a creat baza de date de intrare conține null în loc de groundtruth valoare.

Daca am stabilit:

params.require(:measurement).permit!

Totul's-a salvat cum era de așteptat, dar, desigur, aceasta ucide securitate oferite de puternic parametri.

Am'am găsit soluții, cum de a permis tablouri, dar nu un singur exemplu, folosind obiecte imbricate. Acest lucru trebuie să fie posibil într-un fel, deoarece acesta ar trebui să fie destul de un caz de utilizare comună. Deci, cum funcționează?

Comentarii la întrebare (3)
Soluția

La fel de ciudat ar suna, atunci când doriți să permiteți imbricate atribute specificați atributele de obiecte imbricate într-o matrice. În cazul tău ar fi

Update cum a sugerat de către @RafaelOliveira

params.require(:measurement)
      .permit(:name, :groundtruth => [:type, :coordinates => []])

Pe de altă parte, dacă vrei imbricate de mai multe obiecte, apoi înfășurați-o într-un hash... astfel de prognoze

params.require(:foo).permit(:bar, {:baz => [:x, :y]})


Șine de fapt destul de bine de documentare pe aceasta: http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

Pentru clarificări suplimentare, te-ai putea uita la punerea în aplicare a "permis" și strong_parameters în sine: https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

Comentarii (4)

Am găsit această sugestie utilă în cazul meu:

  def product_params
    params.require(:product).permit(:name).tap do |whitelisted|
      whitelisted[:data] = params[:product][:data]
    end
  end

Verifica asta link de Xavier's comentariu pe github.

Această abordare liste albe întreaga params[:măsurarea][:groundtruth] obiect.

Folosind întrebări originale atribute:

  def product_params
    params.require(:measurement).permit(:name, :groundtruth).tap do |whitelisted|
      whitelisted[:groundtruth] = params[:measurement][:groundtruth]
    end
  end
Comentarii (4)

Permite un obiect imbricate :

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

Dacă este Șine 5, pentru că de noi hash notație: params.permis(:numele, groundtruth: [:tip, coordonate:[]]) va funcționa bine.

Comentarii (0)