0

我想在表单上创建一个下拉选择。我有教授和教室之间的HABTM协会:HABTM关联下拉选择

课堂教学模式:

class Classroom < ApplicationRecord 
    has_and_belongs_to_many :professors 
end 

型号教授:

class Professor < ApplicationRecord 
    has_and_belongs_to_many :classrooms 
end 

强PARAMS:

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与提交的所有资料正确地来了,但classroom_params来到缺少professor_ids。 有没有办法使用f.select来做这个下拉菜单?

+1

什么是控制器中的'cfg'?请附上控制器代码。 –

+0

这只是我写的停止它,然后在提示中看到参数。 –

回答

1

您将'professor_ids'列入了白名单,但是您的'select'输入返回1个字符串(您的屏幕截图为"prefessor_ids" => "2")。也许你想将选择设置为“多个”? (我没有测试它,但我认为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 '在你的控制器动作中变量。

+0

cfg只是为了阻止它并在提示符中获取参数。这种方式仍然无效。它继续不保存数据库表中的教授值。 –

+0

当然,只要保留原来的样子,只需添加'multiple'参数:'f.select:professor_ids,options_for_select(array),{},multiple:true' –