0

我正在嘗試使用form_for創建一個表單,它將添加Employees。對於一個員工,我想分配多個專業,如C#,ASP等作爲值的動態。我使用下面的代碼形式Rails 4 Multipleselect

<%= f.select :specilization, Specialization.all.collect{|p| [p.name, p.id]}, {}, :multiple => true %> 

我的員工和專業化之間像

也取得了HABTM Employee.rb

class Employee < ActiveRecord::Base 
has_and_belongs_to_many :specializations 
end 

Specialization.rb

class Specialization < ActiveRecord::Base 
has_and_belongs_to_many :employees 
end 

這些完成後,即時通訊無法將選定的值保存在db(MySQl)中。如果有人能解決我的問題或指導我如何解決這個問題,將不勝感激?

在此先感謝。

回答

0

我通常通過使用has_many :through來解決這個問題,然後以我的形式在連接模型上選擇一個field_for。就像這樣:

class Employee < ActiveRecord::Base 
    has_many :employees_specializations 
    has_many :specializations, through: :employees_specializations 
    # we will be creating these join models on the employee form 
    accepts_nested_attributes_for :employees_specializations 
end 

class Specialization < ActiveRecord::Base 
    has_many :employees_specializations 
    has_many :employees, through: :employees_specializations 
end 

class EmployeesSpecialization < ActiveRecord::Base 
    belongs_to :employee 
    belongs_to :specializations 
end 

現在要注意的是這種簡化方法我假設專業化的數據庫已經存在,我們只是選擇它們,並將它們加入到我們正在創建/編輯的員工是非常重要的:

# in your controller make sure to build at least 1 new instance, the fields_for needs this 
@employee.employees_specializations.build 

# remember to add to your strong parameters the new join attributes 
params.require(:employee).permit(
    # ... other attributes ... 
    employees_specializations_attributes: [:id, :specialization_id] 
) 

需要聲明:id, :specialization_id作爲子領域,因爲employees_specializations_attributes將是一個嵌套的哈希裏面的鑰匙。

# now in your form use fields_for 
<%= f.fields_for :employees_specializations do |ef| %> 
    <%= ef.select :specialization_id, Specialization.all.map{|p| [p.name, p.id]}, {}, multiple: true %> 
<% end %> 

f.fields_for :employees_specializations將創建一個名爲employee[employees_specializations_attributes][][specialization_id]表單字段。基本上說,我們正在創建一個嵌套的關聯employees_specializations並設置此嵌套協會的specialization_id(記得employees_specialization belongs_to :specialization)到所選擇的專業化。注意[]在字段名稱的中間,這意味着它的嵌套數組employees_specializations

郵報和限制,你應該能夠創建/編輯僱員和設置從現有的專業列表中選擇和創建它們之間的連接模式的專業化任何驗證錯誤。

延伸閱讀:

+0

謝謝。我跟着你的腳步。但我得到一個**符號的無隱式轉換爲整數**控制器錯誤'高清employee_params params.require(:員工).permit(:名稱,:專業化,:employees_specialization [:ID,:specialization_id]) 結束' – Abhishek 2014-09-03 13:17:08

+0

你有一個語法錯誤。冒號(:)在'employees_specialization'的錯誤一側。而且,它不是'employees_specialization',而是'employees_specializations_attributes'。使其成爲:'employees_specializations_attributes:[:id,:specialization_id]' – DiegoSalazar 2014-09-03 14:49:55

+0

仍然沒有運氣。無法保存它有一個數組。當我不在表單中的選擇字段中使用「多個」選項時,可以保存相同的內容。 – Abhishek 2014-09-10 07:32:15