带有未知列的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,如果他们改变。

我认为使用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)中构建所有对象,并且不需要选择框

相关内容

  • 没有找到相关文章

最新更新