1. ホーム
  2. ruby-on-rails

[解決済み] Rails - 強いパラメータ - 入れ子オブジェクト

2022-04-27 11:35:21

質問

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

では、私がサーバーに送信するJSON文字列は以下のとおりです。

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

新許可方式を使うと

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

この場合、エラーは発生しませんが、作成されたデータベース・エントリには null の代わりに、groundtruthの値を使用します。

設定するだけなら。

params.require(:measurement).permit!

しかし、もちろん、これでは強力なパラメータが提供するセキュリティが損なわれてしまいます。

配列を許可する方法は見つけたのですが、ネストされたオブジェクトを使う例は一つもありませんでした。これはかなり一般的な使用例であるはずなので、何らかの方法で可能であるはずです。では、どのように動作するのでしょうか?

解決方法は?

ネストされた属性を許可する場合、奇妙に聞こえるかもしれませんが、配列内でネストされたオブジェクトの属性を指定します。あなたの場合、それは次のようになります。

更新 RafaelOliveira さんの提案による。

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

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

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



Railsには、これに関するかなり良いドキュメントがあります。 http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

さらに明確にするために、以下の実装を見ることができます。 permitstrong_parameters そのものです。 https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247