2016-11-11 5 views
0

Я создаю интерфейс администратора, где администратор (компании) может добавлять пользовательские поля своим сотрудникам.Rails вложенная форма с неизвестными столбцами

Пример:

Модели:

  • Сотрудник: Базовая информация, как имя, контактная информация и т.д. (has_many employee_field_values)
  • EmployeeFields: Они являются динамическими в admin может добавить (у каждой компании разные потребности, это может быть что угодно), скажем 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, например

ИЛИ вы можете построить все объекты управления (для каждого EmployeeField) и обойтись без выбора коробки

Смежные вопросы