1

Je dois implémenter Héritage de table unique pour une classe Personne pouvant être de type Enseignant, Étudiant, Externe.Aide de formulaire en cas d'héritage de table unique

class Person < ActiveRecord::Base 

end 


class Teacher < Person 

end 

class Student < Person 

end 

class Outsider < Person 

end 

Quels changements dois-je apporter dans les routes et les formulaires lors de l'enregistrement d'un nouvel utilisateur. J'ai une colonne (chaîne) "type" dans la table des personnes qui peut être implémentée comme une liste déroulante dans le formulaire pour enregistrer un nouvel utilisateur. Y a-t-il autre chose que je dois faire dans le formulaire afin que l'utilisateur soit enregistré comme un type particulier de personne? Dois-je faire des changements sur les routes aussi?

Répondre

1

Sauf l'ajout d'une liste déroulante de type sélection sous la forme, il n'y a plus rien à faire. Vous pouvez créer un utilisateur de façon normale, comme:

@user = Person.new params[:user] 

Mais la masse attribut type ne pouvait pas être affecté, donc vous devez l'affecter séparément.

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

Le procédé sanitize_user_type permet de valider la valeur d'entrée d'utilisateur.

L'itinéraire de création d'un nouvel utilisateur n'a pas besoin d'être modifié. Si les autres routes doivent changer ou ne pas dépendre de vos besoins. En fait, vous pouvez ajouter les routes pour Teacher, Student, Outsider et les contrôleurs relatifs, de sorte que vous pouvez construire des urls reposantes.

2

Étant donné que vous utilisez un formulaire pour créer tous les types de personnes, vous devez également vous en tenir à un seul contrôleur, vous n'avez donc pas besoin d'ajouter d'itinéraires supplémentaires. L'attribut type n'est pas vraiment quelque chose que vous devez affecter manuellement à une instance, il doit être défini automatiquement en choisissant le type de modèle à créer.

Je ne sais pas à quoi il ressemble dans votre contrôleur et des vues, mais vous pouvez extraire le type de modèle pour créer comme ceci:

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

D'autre part, si l'attribut type est niché dans un formulaire_for dans votre vue, alors l'attribut type est probablement envoyé au contrôleur comme params [: person] [: type] auquel cas il devrait être retiré du hash: person avant qu'il soit utilisé pour créer la nouvelle instance. Peut-être quelque chose comme ceci:

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