1

Ich muss Single Table Inheritance für eine Klasse implementieren Person, die vom Typ Lehrer, Student, Outsider sein kann.Formular Helfer im Falle der Single Table Vererbung

Welche Änderungen muss ich in den Routen und den Formularen vornehmen, während ich einen neuen Benutzer registriere. Ich habe eine Spalte (String) "type" in der People-Tabelle, die als Dropdown in das Formular implementiert werden kann, um einen neuen Benutzer zu registrieren. Gibt es noch etwas, das ich in dem Formular tun muss, damit der Benutzer als eine bestimmte Art von Person registriert wird? Muss ich auch Änderungen an den Routen vornehmen?

Antwort

1

Außer Hinzufügen einer Dropdown-Liste der Typauswahl in der Form, gibt es nichts mehr zu tun. Sie können einen Benutzer in gewohnter Weise, wie erstellen:

@user = Person.new params[:user] 

Aber das type Attribute nicht Masse zugeordnet werden kann, so haben Sie es separat zuweisen.

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

Verfahren sanitize_user_type wird verwendet, um Benutzereingabewert zu validieren.

Die Route zum Erstellen eines neuen Benutzers muss nicht geändert werden. Ob sich andere Routen ändern müssen oder nicht, hängt von Ihren Anforderungen ab. Tatsächlich können Sie die Routen für Teacher, Student, Outsider und relative Controller hinzufügen, so dass Sie erholsame URLs erstellen können.

2

Da Sie ein Formular verwenden, um alle Arten von Personen zu erstellen, sollten Sie auch bei einem Controller bleiben, so dass Sie keine zusätzlichen Routen hinzufügen müssen.

Das Attribut type ist nicht wirklich etwas, das Sie manuell einer Instanz zuweisen sollten. Es sollte automatisch festgelegt werden, indem Sie den Typ des zu erstellenden Modells auswählen.

Ich weiß nicht, wie es in Ihrem Controller und Ansichten aussieht, aber Sie können die Art von Modell extrahieren wie diese zu erstellen:

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

Auf der anderen Seite, wenn das type-Attribut verschachtelt ist in Ein form_for in Ihrer Sicht, dann wird das type-Attribut wahrscheinlich an den Controller gesendet. params [: person] [: type] In diesem Fall sollte es aus dem: person-Hash entfernt werden, bevor es zum Erstellen der neuen Instanz verwendet wird. Vielleicht etwas in der Art:

class_type = params[:person].delete(:type).constantize 
@person = class_type.new(params[:person]) 
Verwandte Themen