Наследование одной таблицы: тип, определенный как константа
Я пытаюсь использовать наследование Single Table, чтобы показать, что сотрудники могут быть менеджерами или консультантами. Итак, вот модель моих сотрудников:
class Employee < ActiveRecord::Base
belongs_to :communaute
self.inheritance_column = :fonction
scope :manager, -> { where(fonction: 'Manager') }
scope :consultant, -> { where(fonction: 'Consultant') }
end
и вот мои подклассы:
class Consultant < Employee
end
class Manager < Employee
end
Когда я против нового взгляда на создание сотрудника. У меня есть неопределенная ошибка метода `fonction', когда я пытаюсь перечислить типы сотрудников. Я не понимаю почему, потому что я определил это в контроллере сотрудников. Не могли бы вы помочь мне с этой ошибкой, пожалуйста.
Ниже моей новой формы
<%= form_for(@employee) do |f| %>
<% if @employee.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@employee.errors.count, "error") %> prohibited this employee from being saved:</h2>
<ul>
<% @employee.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :fonction %><br>
<%= f.select :fonction, Employee.fonction.map {|r| [r.humanize, r.camelcase]}, {}, disabled: @fonction != "Employee" %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
И мой сотрудник контролер
class EmployeesController < ApplicationController
before_action :set_employee, only: [:show, :edit, :update, :destroy]
before_action :set_fonction
def index
@employees = Employee.all
#@employees = fonction_class.all
end
def show
end
def new
#@employee = fonction_class.new
@employee = Employee.new
end
def edit
end
def create
@employee = Employee.new(employee_params)
if @employee.save
redirect_to @employee, notice: "#{fonction} was successfully created."
else
render action: 'new'
end
end
def update
end
def destroy
end
private
def fonction
params[:type] || "Employee"
end
def set_fonction
@fonction = fonction
end
# def fonction_class
# fonction.constantize
#end
def set_animal
@employee = fonction_class.find(params[:id])
end
def employee_params
params.require(fonction.downcase.to_sym).permit(:name, :fonction)
end
end
2 ответа
Вам нужно определить fonction
в вашей модели (app/models/employee.rb
)
То, как вы используете его, подразумевает, что он определен как метод класса, так и метод экземпляра. Это также похоже, что это может быть массив? Employee.fonction.map {|r| ...
или атрибут (так как у вас есть выбор, чтобы установить его на сотрудника.)
Тем не менее, вы определяете функцию как строку...
def fonction
params[:type] || "Employee"
end
Так что я не совсем уверен, чего вы здесь добиваетесь... Все, что я знаю, это Employee.fonction
выглядит как метод класса модели...
def self.fonction
...
end
а также f.select :fonction
выглядит как метод экземпляра или атрибут?
РЕДАКТИРОВАТЬ Я думаю, что у меня есть это... (Извините, я пропустил fonction
ссылка в определении вашей модели)
Попробуйте добавить это к вашей модели сотрудника:
def self.fonction
["Manager", "Consultant", "Employee"]
end
РЕДАКТИРОВАТЬ № 2
Вы также можете определить константу в вашей модели
FONCTIONS = ["Manager", "Consultant", "Employee"]
def fonction
FONCTIONS
end
Вы создали fonction
столбец?, создайте его, введя в свой терминал, когда в каталоге вашего приложения:
rails g migration add_fonction_to_employees fonction
rake db:migrate
Затем проверьте, что в вашей БД есть столбец fonction
в таблице сотрудников.