0

Pourquoi pourquoi ...?Rails5, paramètres non autorisés sous forme imbriquée, tout en associant des objets existants

Trois modèles (FirstModel, SecondModel, JoinedModel), JoinedModel appartient aux deux autres et deux autres has_many les uns des autres, par JoinedModel. JoinedModel accepts_nested_attributes_for first_model et second_model. Il valide également la présence de first_model_id et de second_model_id.

modèle rejoint fortes params:

private 
def joined_params 
    params.require(:joined_model).permit(:first_model_id, :second_model_id, 
        :first_models_attributes => [:id, :name], 
        :second_models_attributes => [:id, :full_name]) 
end 

de _form de JoinedModel:

<%= form_for(joined_model) do |f| %> 
<%= f.fields_for :second_models do |ff| %> 
    <%= ff.select(SecondModel.all.map {|c| [ c.full_name, c.id ] }, { include_blank: true }) -%> 

(et même f.fields_for pour FirstModel)

Quand je soumets ce formulaire, je reçois

Unperm ise params first_models, second_models

Et requête:

Paramètres: { "UTF8" => "✓", "authenticity_token" => "PTAC/OrOXJruAK0ZD + uoajJ4N + dZvpmZF8Ay0TOKF9HPO19d4tRBoWz0C4VoaOABYat8KzrryL8lp5ax + Y9ZJRg == ", " joined_model "=> {" first_models "=> {" first_model_id "=>" 1 "}, " second_models "=> {" second_model_id "=>" 1 "}}," commit "=>" Créer Rejoint modèle "}

Je ne sais pas pourquoi, comment, etc. formulaire essaie d'envoyer un hachage - "second_models"=>{"second_model_id"=>"1"} censé être comme "second_model_id"=>"1" et il fait comme ceci si mon formulaire utilise simplement f.number_field :first_model_id au lieu de select ...

+0

Vous devez ajouter une réponse à votre réponse, puis l'accepter.Se sent bizarre, mais est tout à fait acceptable (et encouragé)! Aussi, peut-être penser à un titre avec plus de clarté? Comment pouvons-nous aider les autres à trouver cette solution lorsqu'ils ont ce problème? – coreyward

+0

oui, bonne idée, je vais le poster. A propos du titre, je pensais que c'est encore mieux comme ça - de nombreux mots clés pertinents (ne pense pas d'autres :)))) –

+0

Votre titre doit être une question concise, pertinente ou une déclaration de problème. La recherche fonctionne très bien sans chargement de mot-clé. ;) – coreyward

Répondre

0

J'ai trouvé la réponse et la volonté quitter ce poste, étant donné que de nombreuses questions sans réponses similaires trouvées sur StackOverflow

donc, la réponse était d'utiliser les champs de parents constructeur pour select, comme:

<%= form_for(joined_model) do |f| %> 
<%= f.fields_for :second_models do |ff| %> 
    <%= f.select(SecondModel.all.map {|c| [ c.full_name, c.id ] }, { include_blank: true }) -%> 

on dirait que ça fonctionne tout va bien, mais si quelqu'un sait pourquoi j'ai même besoin de fournir des objec t (dans mon cas |ff|) pour les champs imbriqués si je ne l'utilise même pas, je vais donner une danse Hi Five et Tango!

MISE À JOUR:

Je trouve que, dans cette situation, je ne ai même pas besoin fields_for ... Maintenant, tout cela fait SENCE puisqu'ici je créais un nouveau record de JoinedModel et seulement sélection autres deux enregistrements (existants) et l'association me permet simplement de saisir ces méthodes ... Bit boiteux, mais oh bien ...