112

私はかなり簡単な質問があります。しかし、これまでのところ解決策は見つかっていません。Rails 4 - 強いパラメータ - ネストされたオブジェクト

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

新しい許可証方式を使用して、私が持っている:だからここ

は、私がサーバーに送信JSON文字列だ

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

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

私はちょうど設定した場合:予想通り

params.require(:measurement).permit! 

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

私は解決策、配列の許可方法を見つけましたが、ネストされたオブジェクトを使用した単一の例は見つかりませんでした。これはかなり一般的なユースケースでなければならないので、何とか可能でなければなりません。だから、どうやって動くの?

+0

このhttp://stackoverflow.com/questions/14483963/rails-4-0に見て-strong-parameters-nested-attributes-of-a-key-to-a-hash –

+1

@vinodadhikaryそれは正しい...私はOPが混乱していると思います。ネストされた属性を許可したいときには奇妙に思えますが、配列内のネストされたオブジェクトの属性を指定します。一方、複数のオブジェクトをネストしたい場合は、ハッシュの中にラップします.http://api.rubyonrailsを参照してください。org/classes/ActionController/Parameters.html#method-i-permitおよびhttps://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247 – j03w

+0

@ j03w 、ソースへのリンクありがとう。今は明らかです。この発見のためにここに答えを加えて、他の多くの人々に役立つと思うようにしてください。 – vee

答えて

143

ネストされた属性を許可する場合は、配列内のネストされたオブジェクトの属性を指定することをお勧めします。 @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

さらに明確にするために、あなたはpermitの実装とstrong_parameters自身で見ることができる:https://github.com/rails/rails/blob/master/actionpack/lib/action_controller/metal/strong_parameters.rb#L246-L247

+4

どちらの場合もこの答えで同じですが、実際には{{groundtruth => [...]};では中括弧はオプションです。これはハッシュですが、インタプリタはハッシュの開始位置と終了位置を明示的な中括弧なしで判断することができます。 – speakingcode

+0

属性のネストされた配列はネストされた属性を許可しません。ネストされた属性とattr_accessorは、私のアプリケーションに「Unpermitted parameters」としてリストされています。まだ安全な解決策を探しています。 – Katarzyna

+0

複数のネストされたオブジェクトの場合は、このIDが動作するようにする必要があります。さらに詳しい情報はこちら:http://stackoverflow.com/questions/18308714/nested-fields-and-strong-parameters –

17

私は、私の場合に有用この提案が見つかりました:

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

チェックをgithubの上のザビエルさんのコメントこのlink

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

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

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

ちょっとしたことですが、これはまだ許容されていないパラメータとしてログに表示されますが、モデルはそれを受け入れます。 –

+4

Rails 4についてはわかりませんが、私のRails 5プロジェクトでは、 'permit!'をホワイトリストに登録する必要があります。そうでなければ、それをタップしても許可されません。この場合は 'params [:measurement] [:groundtruth] .permit!'となります。 – nayiaw

2

params.permit({:school => [:id , :name]}, 
       {:student => [:id, 
          :name, 
          :address, 
          :city]}, 
       {:records => [:marks, :subject]}) 
関連する問題