54

次のパラメータを使用して http put リクエストを作成します。

{"post"=>{"files"=>{"file1"=>"file_content_1", "file2"=>"file_content_2"}}, "id"=>"4"}

コードでハッシュ配列を許可する必要があります。私がこれらのように試したマニュアルに基づいて:

> params.require(:post).permit(:files) # does not work
> params.require(:post).permit(:files => {}) # does not work, empty hash as result
> params.require(:post).permit! # works, but all params are enabled

正しく作る方法は?

UPD1 : file1、file2 - 動的キーです

4

12 に答える 12

76

レール 5.1+

params.require(:post).permit(:files => {})

レール5

params.require(:post).tap do |whitelisted|
  whitelisted[:files] = params[:post][:files].permit!
end

Rails 4 以下

params.require(:post).tap do |whitelisted|
  whitelisted[:files] = params[:post][:files]
end
于 2013-08-21T06:14:03.930 に答える
17

これが古い投稿であることを理解しています。しかし、Google 検索でこの結果が得られたので、その結果を共有したいと思いました。

動作することがわかった代替ソリューションを次に示します(Rails 4):

params = ActionController::Parameters.new({"post"=>{"files"=>{"file1"=>"file_content_1", "file2"=>"file_content_2"}}, "id"=>"4"})
params.require(:post).permit(files: params[:post][:files].keys)
# Returns: {"files"=>{"file1"=>"file_content_1", "file2"=>"file_content_2"}}

この回答と受け入れられた回答の違いは、このソリューションがパラメーターを動的キーの 1 レベルのみに制限することです。受け入れられた答えは、複数の深さを許可します。

[編集] コメントからの役立つヒント

「ああ、params[:post][.files] が存在することを確認する必要があります。そうしないと、キーが失敗します」

于 2016-04-21T20:13:09.213 に答える