Rails 4 - 強いパラメータ - 入れ子オブジェクト

とても簡単な質問があります。しかし、今のところ解決策は見つかっていません。

サーバに送るJSON文字列は以下の通りです:

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

新しいpermitメソッドを使うと、次のようになる:

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

これはエラーは発生しませんが、作成されたデータベース・エントリには真実の値の代わりにnullが含まれています。

もし

params.require(:measurement).permit!

と設定するだけで、すべてが期待通りに保存される。

私は配列を許可する解決策を見つけましたが、入れ子になったオブジェクトを使う例は一つもありませんでした。これはかなり一般的なユースケースのはずなので、何らかの方法で可能なはずです。では、どうすればいいのでしょうか?

質問へのコメント (3)
ソリューション

ネストされた属性を許可する場合、配列の中でネストされたオブジェクトの属性を指定することになります。あなたの場合は

ラファエル・オリヴェイラ(@RafaelOliveira)が提案したように、Updateとする。

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

一方、複数のオブジェクトをネストさせたい場合は、次のようにハッシュで囲みます。

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

私の場合、この提案が役に立った:

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

github の Xavier's のコメントの リンク をチェックしてください。

このアプローチでは、params[:measurement][:groundtruth]オブジェクト全体をホワイトリストに登録します。

オリジナルの質問属性を使用します:

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

ネストされたオブジェクトの許可 :

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

それがRails 5の場合、新しいハッシュ表記のため: params.permit(:name、groundtruth:[:type、correat:[]])は正常に動作します。

解説 (0)