我正在尝试在表单上创建下拉选择。我在教授和教室之间有一个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。我试着调试它在提交后停止控制器,我得到了这个:
params正确提交了所有提交的信息,但是教室_params缺少了professor_ids。
有没有办法使用f.select
?
答案 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;控制器动作中的变量。