Tout d'abord, je veux simplement placer un objet dans l'objet actuel que j'envoie à mon back-end
.
J'ai ce simple JSON
(généré à partir d'un formulaire):
{
"name": "Project 1",
"project_criteria": [
{
"name": "Criterium 1",
"type": "Type 1",
"benefit": "1"
},
{
"name": "Criterium 2",
"type": "Type 2",
"benefit": "3"
}
]
}
Mon 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
Mais je ne peux toujours pas accéder à project_criteria
paramètre comme vous pouvez le voir ci-dessous:
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 # <-----------
Remarque:
Au fait, j'ai déjà essayé d'utiliser critère au lieu de critère (lequel - à mon avis - est le bon puisqu'il doit être pluralisé) dans has_many
et accepts_nested_attributes_for
, mais cela ne fonctionne pas non plus.
Quelqu'un a-t-il une solution à cela?
Ce n'est pas l'inflexion des "critères" de Word qui vous pose des problèmes (bien que vous puissiez ajouter un inflecteur personnalisé pour obtenir les versions singulières et plurielles que vous préférez si vous le voulez vraiment).
Le problème est que vous devez autoriser explicitement les champs des objets imbriqués.
Modifiez vos paramètres actuels:
params.require(:project).permit(:name, project_criteria: [] )
Pour cela (pour un seul objet imbriqué):
params.require(:project).permit(:name, project_criteria: [:name, :type, :benefit] )
Votre cas est quelque peu aggravé par le fait que vous avez affaire à plusieurs objets imbriqués, vous devrez donc passer un hachage à la place:
params.require(:project).permit(:name, { project_criteria: [:name, :type, :benefit]} )