2016-11-11 8 views
0

admin(会社の管理者)が従業員にカスタムフィールドを追加できる管理インターフェイスを作成しています。不明な列のネストされたフォーム

例:

モデル:

  • 従業:などの名前、連絡先情報、などの基本情報(にhas_manyのemployee_field_values)
  • EmployeeFields:これらは動的なものです管理者は追加することができます(会社ごとに異なるニーズがあります)。favorite_food
  • EmployeeFieldValues:上記のフィールドに基づいて、実際の値は、言う

従業員の編集中にEmployeeFieldValuesフィールドを追加するスマートな方法は何ですか(上記の両方のモデルbelongs_toの)pizza

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

ので、わからないが、これがある場合:私はこのような単純な、しかし、更新時に、私はその後、

# 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]はこの与えます良い方向、また、私は従業員の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を、あなたが選択ボックス

ずに(各EmployeeField用)コントローラ内のすべてのオブジェクトを構築することができます

OR例えばgem cocoonでそれを行うと行うことができます

関連する問題