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' –