0

J'essaie de créer une sélection déroulante dans un formulaire. J'ai une association HABTM entre les professeurs et les salles de classe:Liste déroulante d'association HABTM sélectionnez

Modèle Classe:

class Classroom < ApplicationRecord 
    has_and_belongs_to_many :professors 
end 

Professeur Modèle:

class Professor < ApplicationRecord 
    has_and_belongs_to_many :classrooms 
end 

Params forts:

def classroom_params 
    params.require(:classroom).permit(:name, :professor_ids => []) 
end 

Je suis en train de trouver un façon d'utiliser f.select au lieu de select_tag à l'intérieur du formulaire. Mais quand je le fais, la base de données n'enregistre pas les valeurs. De cette façon fonctionne:

<%= form_for @classroom do |f| %> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %><br> 
    <% array = Professor.all.map { |professor| [professor.user.name, professor.id] } %> 
    <%= select_tag "classroom[professor_ids][]", options_for_select(array) %> 
<% end %> 

Mais je suis en train comme ça et il ne fonctionne pas:

<%= form_for @classroom do |f| %> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %><br> 
    <% array = Professor.all.map { |professor| [professor.user.name, professor.id] } %> 
    <%= f.select :professor_ids, options_for_select(array) %> 
<% end %> 

La vue fonctionne correctement, mais lorsque je soumets la forme, la valeur ne va pas à la classroom_params. J'ai essayé de déboguer arrêter le contrôleur après la soumettre et je suis arrivé ceci:

enter image description here

Les params sont venus correctement avec toutes les informations fournies, mais les classroom_params venu manquer les professor_ids. Existe-t-il un moyen de faire cette liste déroulante en utilisant f.select?

+1

Qu'est-ce que 'cfg' dans le contrôleur? Veuillez attacher le code du contrôleur. –

+0

C'est juste quelque chose que j'ai écrit pour l'arrêter et ensuite voir les paramètres à l'invite. –

Répondre

1

Vous avez mis en liste blanche le tableau de 'professor_ids', mais votre entrée 'select' renvoie 1 chaîne ("prefessor_ids" => "2" de votre capture d'écran). Peut-être que vous voulez définir le sélectionner comme «multiple»? (Je ne l'ai pas testé, mais je pense que params sera correctement après liste blanche)

<%= form_for @classroom do |f| %> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %><br> 
    <%= s.collection_select :professor_ids, Professor.all, :id, :name, multiple: true %> 
<% end %> 

class Professor 
    ... 
    delegate :name, to: :user 
end 

Mise à jour

Vous n'avez probablement pas « cfg 'variable dans votre action de contrôleur.

+0

Le cfg est juste pour l'arrêter et obtenir les params dans l'invite. Cette façon ne fonctionne toujours pas. Il continue à ne pas enregistrer la valeur du professeur dans la table db. –

+0

Bien sûr, laissez le simplement comme vous l'aviez, ajoutez simplement le paramètre 'multiple': 'f.select: professor_ids, options_for_select (array), {}, multiple: true' –