2016-08-19 5 views
5

Zuerst möchte ich einfach ein Objekt innerhalb des aktuellen Objekts, das ich an meine back-end senden.Unerreichter Parameter in Rails 5

Ich habe diese einfache JSON (aus einem Formular generiert):

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

Mein 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 

Aber ich kann immer noch nicht Zugang project_criteria Parameter wie Sie unten sehen können:

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 # <----------- 

Hinweis:

By the way, ich schon criterium statt Kriterien (die zu verwenden versucht - meiner Meinung nach - ist das Richtige, da es plural sein sollte) in has_many und accepts_nested_attributes_for, aber es funktioniert auch nicht.

Hat jemand eine Lösung dafür?

Antwort

15

Es ist nicht die Flexion des Wortes "Kriterien", die Ihnen Probleme gibt (obwohl Sie einen benutzerdefinierten Inflector hinzufügen können, um die Singular- und Pluralversionen zu erhalten, die Sie bevorzugen, wenn Sie wirklich wollen).

Das Problem ist, dass Sie die Felder verschachtelter Objekte explizit zulassen müssen.

Ihre aktuelle params ändern:

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

Um dies (für ein einzelnes verschachteltes Objekt):

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

Ihr Fall wird etwas durch die Tatsache, dass Sie mit mehreren verschachtelten Objekten zu tun hat , so müssen Sie stattdessen einen Hash übergeben:

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

Danke für die Antwort, aber mit beiden Möglichkeiten, die Sie vorschlagen ed gibt: 'ActiveRecord :: AssociationTypeMismatch (ProjectCriterium (# 39449900) erwartet, habe Array (# 17940440)):' – developer033

+0

Ich vermute, Sie übergeben JSON als Hash? Das mag dumm klingen, aber ... wenn Sie ein Array am Ende wollen, übergeben Sie einen Hash (mein Beispiel). Wenn Sie am Ende einen Hash haben wollen, übergeben Sie ein Array (das scheint das zu sein, was Sie wollen), also ersetzen Sie einfach die Curlies durch eckige Klammern und versuchen Sie es. – MarsAtomic

+0

Nun, ich passierte den Weg, den ich im ersten Teil meiner Frage geschrieben hatte, aber es kommt als 'hash' (' "project_criteria" => {"0" => {"benefit" => "1", " Name "=>" Kriterium 1 "," Typ "=>" Typ 1 "}," 1 "=> {" Nutzen "=>" 3 "," Name "=>" Kriterium 2 "," Typ "=> "Typ 2"}}}} '). Übrigens, ich möchte am Ende ein Array haben ... aber leider geben beide Ihre Vorschläge mir diesen Fehler. – developer033