HABTM协会下拉选择

时间:2017-02-18 05:24:49

标签: ruby-on-rails forms drop-down-menu html-select has-and-belongs-to-many

我正在尝试在表单上创建下拉选择。我在教授和教室之间有一个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。我试着调试它在提交后停止控制器,我得到了这个:

enter image description here

params正确提交了所有提交的信息,但是教室_params缺少了professor_ids。 有没有办法使用f.select

执行此下拉菜单

1 个答案:

答案 0 :(得分:2)

您将教授&#39; professor_ids&#39;列入白名单,但您选择&#39;输入返回1个字符串("prefessor_ids" => "2"从您的屏幕截图)。也许你想将选择设置为&#39; multiple&#39;? (我没有测试过,但我认为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

<强> 更新

你可能没有&#39; cfg&#39;控制器动作中的变量。