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' 变量。
我正在尝试在表单上创建下拉菜单 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' 变量。