web-dev-qa-db-ja.com

Rails 4-強力なパラメーター-ネストされたオブジェクト

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

サーバーに送信するJSON文字列は次のとおりです。

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

新しい許可方法を使用すると、次のようになります。

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

これはエラーをスローしませんが、作成されたデータベースエントリには、groundtruth値の代わりにnullが含まれます。

設定したばかりの場合:

params.require(:measurement).permit!

すべてが期待どおりに保存されますが、もちろん、これは強力なパラメーターによって提供されるセキュリティを無効にします。

私は解決策、配列を許可する方法を見つけましたが、ネストされたオブジェクトを使用した単一の例はありません。これはかなり一般的なユースケースであるはずなので、どうにかして可能でなければなりません。それで、それはどのように機能しますか?

130
Benjamin M

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

@ RafaelOliveiraが提案するUpdate

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

さらに明確にするために、permitおよびstrong_parameters自体の実装を確認できます。 https://github.com/Rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246- L247

167
j03w

私の場合、この提案が役に立ちました。

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

これを確認してください リンク githubに関するXavierのコメント。

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

元の質問属性の使用:

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

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

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

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

0
user8164115