とても簡単な質問があります。しかし、これまでのところ解決策を見つけていません。
サーバーに送信するJSON文字列は次のとおりです。
{
"name" : "abc",
"groundtruth" : {
"type" : "Point",
"coordinates" : [ 2.4, 6 ]
}
}
新しい許可方法を使用すると、次のようになります。
params.require(:measurement).permit(:name, :groundtruth)
これはエラーをスローしませんが、作成されたデータベースエントリには、groundtruth値の代わりにnull
が含まれます。
設定したばかりの場合:
params.require(:measurement).permit!
すべてが期待どおりに保存されますが、もちろん、これは強力なパラメーターによって提供されるセキュリティを無効にします。
私は解決策、配列を許可する方法を見つけましたが、ネストされたオブジェクトを使用した単一の例はありません。これはかなり一般的なユースケースであるはずなので、どうにかして可能でなければなりません。それで、それはどのように機能しますか?
ネストされた属性を許可する場合に奇妙に聞こえますが、配列内のネストされたオブジェクトの属性を指定します。あなたの場合、それは
@ 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
私の場合、この提案が役に立ちました。
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
ネストされたオブジェクトの許可:
params.permit( {:school => [:id , :name]},
{:student => [:id,
:name,
:address,
:city]},
{:records => [:marks, :subject]})
それがRails 5の場合、新しいハッシュ表記のため:params.permit(:name, groundtruth: [:type, coordinates:[]])
は正常に動作します。