web-dev-qa-db-ja.com

Rails 4配列の許可されていないパラメーター

モデルに配列フィールドがあり、それを更新しようとしています。

私の強力なパラメータ方法は以下です

def post_params
  params["post"]["categories"] = params["post"]["categories"].split(",")

  params.require(:post).permit(:name, :email, :categories)
end

コントローラーでのアクションは次のとおりです

def update
  post = Post.find(params[:id]

  if post and post.update_attributes(post_params)
    redirect_to root_url
  else
    redirect_to posts_url
  end
end

しかし、アップデートを投稿するたびに、開発ログに次のように表示されます

Unpermitted parameters: categories

渡されるパラメーターは

  Parameters: {"utf8"=>"✓", "authenticity_token"=>"auth token", "id"=>"10", 

"post"=>{"name"=>"Toni Mitchell", "email"=>"[email protected]", "categories"=>",2"}}

私は、属性categoriesが配列であるという事実と関係があると考えたいと思います。その後、再び、私は間違っている可能性があります。それで、私のコードの何が問題なのですか?明確に許可されているのに、カテゴリフィールドを保存させないのはなぜですか?ありがとう。

50
jason328

これを試して

params.require(:post).permit(:name, :email, :categories => [])

(私のコメントは無視してください、私はそれは重要ではないと思います)

131
Slicedpan

in Rails 4、つまり

params.require(:post).permit(:name, :email, {:categories => []})
41
Imtiaz Emu

許可されるスカラータイプは、StringSymbolNilClassNumericTrueClassFalseClassDateTimeDateTimeStringIOIOActionDispatch::Http::UploadedFileおよびRack::Test::UploadedFile

Paramsの値が許可されたスカラー値の配列でなければならないことを宣言するには、キーを空の配列にマップします。

params.permit(:id => [])

これが Githubの強力なパラメータードキュメント の意味です:

params.require(:post).permit(:name, :email, :categories => [])

これがあなたの役に立つことを願っています。

8

私は同じ問題を抱えていましたが、許可するために配列を追加するだけでは十分ではありませんでした。タイプも追加する必要がありました。こちらです:

params.require(:transaction).permit(:name, :tag_ids => [:id])

これが完璧な解決策かどうかはわかりませんが、その後、「許可されていないパラメーター」ログが消えました。

この素晴らしい投稿からその解決策のヒントを見つけました: http://patshaughnessy.net/2014/6/16/a-rule-of-thumb-for-strong-parameters

1
Heikki Hannula

私は同じ問題を抱えていましたが、私の場合は次のものからも変更する必要がありました:

<input type="checkbox" name="photographer[attending]" value="Baku">

に:

<input type="checkbox" name="photographer[attending][]" value="Baku">

これが誰かを助けることを願っています。

1
Carlo S