まず最初に、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
の-は私の意見では-は複数形にする必要があるため正しいです。動作しません。
誰かがこれに対する解決策を持っていますか?
問題を与えているのは「基準」という単語の活用ではありません(カスタムインフレクタを追加して、本当に必要な場合に単数形と複数形を取得できます)。
問題は、ネストされたオブジェクトのフィールドを明示的に許可する必要があることです。
現在のパラメーターを変更します。
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]} )