2016-11-11 107 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),并没有做选择框