我正在创建一个管理界面,其中管理员(公司的)可以为他们的员工添加自定义字段。
的例子:
模型:
- 员工:基本信息,如姓名,联系信息等(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,如果他们改变。
我认为使用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
<<p> 视图/strong> = 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来做,例如
或您可以在控制器(每个EmployeeField)中构建所有对象,并且不需要选择框