Помощники по формам в случае наследования одной таблицы - PullRequest
1 голос
/ 13 декабря 2010

Мне нужно реализовать наследование одной таблицы для класса Лицо, которое может относиться к типу Учитель, Ученик, Аутсайдер.

class Person < ActiveRecord::Base

end


class Teacher < Person

end

class Student < Person

end

class Outsider < Person

end

Какие изменения необходимо внести в маршруты и формы при регистрацииновый пользователь.У меня есть столбец (строка) «тип» в таблице людей, которые могут быть реализованы в виде раскрывающегося списка в форме для регистрации нового пользователя.Есть ли еще что-то, что мне нужно сделать в форме, чтобы пользователь был зарегистрирован как особый тип личности?Нужно ли вносить какие-либо изменения в маршруты?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2010

Поскольку вы используете одну форму для создания всех типов персонажей, вам также следует придерживаться одного контроллера, чтобы вам не нужно было добавлять какие-либо дополнительные маршруты.

Атрибут type на самом деле не тот, что выследует назначить экземпляру вручную, его следует установить автоматически, выбрав тип создаваемой модели.

Я не знаю, как он выглядит в вашем контроллере и представлениях, но вы можете извлечь тип модели длясоздайте так:

class_type = params[:type].constantize
@person = class_type.new

С другой стороны, если атрибут type вложен в form_for в вашем представлении, то атрибут type, вероятно, отправляется в контроллер как params [: person] [: type] в этом случае он должен быть удален из хэша: person, прежде чем он будет использован для создания нового экземпляра.Возможно, что-то вроде этого:

class_type = params[:person].delete(:type).constantize
@person = class_type.new(params[:person])
1 голос
/ 13 декабря 2010

Кроме добавления выпадающего списка выбора типа в форме, больше ничего не нужно делать. Вы можете создать пользователя обычным способом, например:

@user = Person.new params[:user]

Но атрибут type не может быть назначен по массе, поэтому его нужно назначать отдельно.

@user.type = sanitize_user_type params[:user][:type]

Метод sanitize_user_type используется для проверки введенного пользователем значения.

Маршрут для создания нового пользователя не нужно менять. Нужно ли менять другие маршруты или нет, зависит от ваших требований. На самом деле вы можете добавить маршруты для Teacher, Student, Outsider и соответствующих контроллеров, чтобы вы могли создавать релакс-URL.

...