HABTM 协会下拉列表 select

HABTM association dropdown select

我正在尝试在表单上创建下拉菜单 select。我在教授和课堂之间建立了 HABTM 协会:

课堂模型:

class Classroom < ApplicationRecord
  has_and_belongs_to_many :professors
end

教授模型:

class Professor < ApplicationRecord
  has_and_belongs_to_many :classrooms
end

强参数:

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

我正在尝试找到一种在表单中使用 f.select 而不是 select_tag 的方法。但是当我这样做时,数据库不会保存这些值。这种方式有效:

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

但我正在这样尝试,但它不起作用:

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

视图工作正常,但是当我提交表单时,值没有转到 classroom_params。我试图调试它在提交后停止控制器,我得到了这个:

提交的所有信息都正确地提供了参数,但是 classroom_params 缺少 professor_ids。 有没有办法使用 f.select 来完成此下拉菜单?

您将 'professor_ids' 的数组列入白名单,但您的 'select' 输入 returns 1 个字符串("prefessor_ids" => "2" 来自您的屏幕截图)。也许您想将 select 设置为 'multiple'? (我没有测试过,但我认为params之后会被正确列入白名单)

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

更新

您的控制器操作中可能没有 'cfg' 变量。