2017-06-09 2 views
3

私のモデル(document => field_instance => value)で深くネストされたJSONフィールドを通過させようとしています。私はdocumentationの誤解のため空のハッシュを使用していました。Rails 5では、JSONフィールドが強力なパラメータで動作しないようにしています。

許可!私が必要とすることをすることができますが、私は単にこれが開く大規模なセキュリティホールのためにparams.fetch(:document).permit!をやることを避けようとしています。だから、二重に入れ子になったJSON値の 'parameter'の下で、どのような型の構造体も許可するにはどうしたらよいですか?

各instance_fieldは、必要なパラメータのリストを持っている特定のタイプを持っていますが、具体的なことの道なし:私は値と呼ばれるテキストの下に、単一の文字列を使用してテストしていて、「テキスト許可されていないパラメータ」を取得しています

ドキュメントのinstance_fieldごとに、そのJSONフィールドの下にあるすべてのパラメータを許可するように選択しました。ここで

は私のdocument_params方法である:

params.fetch(:document) 
    .permit(:structure_id, :field_instances_attributes => [ 
    :value, 
    :document_id, 
    :field_id, 
    :value_attributes => {} 
    ]) 

だから、私がここで間違って何をやっていますか?

さらに、各field_instanceには、フィールドの値が期待する正確な構造を認識するタイプがあります。各field_instanceの値の下で許可されるフィールドについて具体的にすることはできますか?

関連ログ:

service_1 | Parameters: {"utf8"=>"Ô£ô", "authenticity_token"=>" -- censored --", "document"=>{"structure_id"=>"1", "field_instances_attributes"=>[{"document_id"=>"0", "field_id"=>"1", "value_attributes"=>{"text"=>"asdf"}}]}, "commit"=>"Create Document"} 
service_1 | Unpermitted parameter: text 
service_1 | Unpermitted parameter: text 
service_1 | #<FieldInstance id: nil, field_id: 1, document_id: nil, value: nil, created_at: nil, updated_at: nil> 

答えて

1

これは、複数のステップでparamsハッシュを構築するために、実際にはかなり簡単ですが、それは少し非自明です。

は、ここで私は何をすべきかです:valueオブジェクトのサニタイズは本当に複雑であれば、おそらく独自のヘルパーとしてそれを書いて、ここでそれを使用

def document_params 
    @document_params ||= params.require(:document).permit(:structure_id, field_instance_atributes: %i[document_id field_id]).tap do |doc| 
    doc[:value] = params[:document].require(:value).permit! 
    end 
end 

重要な部分は、requireの使用です。内側の値を新しいオブジェクトとして返します。したがって、それに対する操作はparamsに影響しません。あなたは必要に応じて何度でも井戸に戻り、話すことができます。

警告:requireは、キーが見つからない場合はActionController::ParameterMissingとなります。

関連する問題