2016-11-11 77 views
0

我正在創建一個管理界面,管理員(公司)可以向其員工添加自定義字段。未知列的Rails嵌套窗體

實施例:

型號:

  • 僱員:如姓名,聯繫信息等基本信息(的has_many employee_field_values)
  • EmployeeFields:這些是動態的的管理員可以添加(每個公司有不同的需求,可以是任何東西),可以說favorite_food
  • EmployeeFieldValues:基於上述領域的實際值,說pizza(belongs_to的上述兩種型號)

什麼是添加EmployeeFieldValues領域,同時編輯僱員的一個聰明的辦法?

我想簡單的東西就是這樣,但不知道我是否喜歡它

# Controller 
@custom_fields = EmployeeFields.all 

# View 
<%= form_for(@employee) do |f| %> 
    <%= f.text_field :first_name %> 

    <% @custom_fields.each do |custom_field| %> 
    <%= custom_field.name %> 
    <%= text_field_tag "employee_field_values[#{custom_field.name}]" %> 
    <% end %> 

    <%= f.submit :save %> 
<% end %> 

,然後更新時,params[:employee_field_values]給出了這樣的:

<ActionController::Parameters {"favorite_food"=>"pizza"}> 

所以,不知道這是一個好的方向,我也不確定如果他們改變,如何處理員工custom_fields的未來編輯。

回答

0

我認爲將EmployeeField作爲嵌套模型和EmployeeFieldValue用於選擇字段會更好。 例如:

模型

class Employee < ActiveRecord::Base 

    validates :name, presence: true 

    has_many :employee_field_values 

    accepts_nested_attributes_for :employee_field_values, reject_if: ->(x) { x[:value].blank? } 

end 

class EmployeeFieldValue < ActiveRecord::Base 

    belongs_to :employee 
    belongs_to :employee_field 

end 

class EmployeeField < ActiveRecord::Base 

    has_many :employee_field_values, inverse_of: :employee_field, dependent: :destroy 
    validates :title, presence: true, uniqueness: true 

end 

控制器

class EmployeesController < ApplicationController 

    def new 
    @employee = Employee.new 
    @employee.employee_field_values.build 
    end 

end 

查看

= simple_form_for @employee, url: '/' do |f| 
    = f.input :name 

    = f.simple_fields_for :employee_field_values do |ff| 
    = ff.input :value 
    = ff.input :employee_field_id, collection: EmployeeField.all.map{|x| [x.title, x.id]} 

你也需要做出按鈕添加/刪除:employee_field_value,你可以用gem cocoon做到這一點,例如

OR你可以建立在控制器中的所有對象(每個EmployeeField),並沒有做選擇框