web-dev-qa-db-fra.com

Paramètre non autorisé dans Rails 5

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?

15
developer033

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]} )
31
MarsAtomic