web-dev-qa-db-ja.com

Rails 5の許可されていないパラメーター

まず最初に、back-endに送信する現在のオブジェクト内のオブジェクトを取得するだけです。

この単純なJSON(フォームから生成)があります:

{
  "name": "Project 1",
  "project_criteria": [
    {
      "name": "Criterium 1",
      "type": "Type 1",
      "benefit": "1"
    },
    {
      "name": "Criterium 2",
      "type": "Type 2",
      "benefit": "3"
    }
  ]
}

私のclasses

class Project < ApplicationRecord
    has_many :project_criteria
    accepts_nested_attributes_for :project_criteria
end

class ProjectCriterium < ApplicationRecord
    belongs_to :project
end

ProjectsController:

def project_params
    params.require(:project).permit(:name,  project_criteria: [] )
end

ただし、以下に示すように、project_criteriaパラメーターにはアクセスできません。

Started POST "/projects" for 127.0.0.1 at 2016-08-19 16:24:03 -0300
Processing by ProjectsController#create as HTML
  Parameters: {"project"=>{"name"=>"Project 1", "project_criteria"=>{"0"=>{"benefit"=>"1", "name"=>"Criterium 1", "type"=>"Type 1"}, "1"=>{"benefit"=>"3", "name"=>"Criterium 2", "type"=>"Type 2"}}}}
Unpermitted parameter: project_criteria # <-----------

注:

ところで、criteria()の代わりにcriteriumを使用しようとしましたhas_manyおよびaccepts_nested_attributes_for-は私の意見では-は複数形にする必要があるため正しいです。動作しません。

誰かがこれに対する解決策を持っていますか?

15
developer033

問題を与えているのは「基準」という単語の活用ではありません(カスタムインフレクタを追加して、本当に必要な場合に単数形と複数形を取得できます)。

問題は、ネストされたオブジェクトのフィールドを明示的に許可する必要があることです。

現在のパラメーターを変更します。

params.require(:project).permit(:name,  project_criteria: [] )

これに(単一のネストされたオブジェクトの場合):

params.require(:project).permit(:name,  project_criteria: [:name, :type, :benefit] )

複数のネストされたオブジェクトを処理しているという事実によって、ケースが多少複雑になっているため、代わりにハッシュを渡す必要があります。

params.require(:project).permit(:name,  { project_criteria: [:name, :type, :benefit]} )
31
MarsAtomic