0

Ich versuche, eine Dropdown-Auswahl auf einem Formular zu erstellen. Ich habe eine HABTM Assoziation zwischen Professoren und Klassenzimmer:HABTM Assoziation Dropdown wählen

Klassenzimmer Modell:

class Classroom < ApplicationRecord 
    has_and_belongs_to_many :professors 
end 

Professor Modell:

class Professor < ApplicationRecord 
    has_and_belongs_to_many :classrooms 
end 

Starke Params:

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

Ich versuche, eine finden Weg, f.select anstelle von select_tag innerhalb des Formulars zu verwenden. Aber wenn ich es mache, speichert die Datenbank die Werte nicht. Auf diese Weise funktioniert:

<%= 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 %> 

aber ich mag, dass ich versucht und es funktioniert nicht:

<%= 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 %> 

Die Ansicht richtig funktioniert, aber wenn ich das Formular abschicken, wird der Wert gehen nicht auf die klassenzimmer_params. Ich habe versucht, es zu debuggen, den Controller zu stoppen, nachdem der einreichen und ich habe dies:

enter image description here

Die params kam korrekt mit allen Informationen vorgelegt, aber die classroom_params kamen die professor_ids fehlt. Gibt es eine Möglichkeit, dieses Dropdown mit f.select zu tun?

+1

Was ist 'cfg' im Controller? Bitte fügen Sie den Controller-Code bei. –

+0

Es ist nur etwas, was ich geschrieben habe, um es zu stoppen und dann die Parameter bei der Eingabeaufforderung zu sehen. –

Antwort

1

Sie haben das Array von 'professor_ids' auf die weiße Liste gesetzt, aber Ihr 'select'-Eingang gibt 1 String zurück ("prefessor_ids" => "2" von Ihrem Screenshot). Vielleicht möchten Sie die Auswahl als "mehrere" festlegen? (Ich habe es nicht getestet, aber ich denke, params danach richtig weiße Liste gesetzt werden)

<%= 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 %> 

wo

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

aktualisieren

Sie haben wahrscheinlich nicht ‚cfg 'Variable in Ihrer Controller-Aktion.

+0

Das cfg ist nur um es zu stoppen und die params in der Eingabeaufforderung zu erhalten. Dieser Weg funktioniert immer noch nicht. Es speichert weiterhin den Professor-Wert in der db-Tabelle nicht. –

+0

Natürlich, lassen Sie es so, wie Sie es hatten, fügen Sie einfach den 'multiple' Parameter: 'f.select: professor_ids, options_for_select (array), {}, multiple: true' –