2010-05-27 16 views
1

Je configure l'héritage Single Table, en utilisant ContactEvent comme modèle que ContactEmail, ContactLetter et ContactCall hériteront tous.Comment créer le contrôleur pour un héritage de table unique dans Rails?

Mais je suis perplexe sur la façon de créer le routage et le contrôleur. Par exemple, supposons que je souhaite créer un nouvel événement ContactEvent avec le type E-mail.

Je voudrais une façon de faire ce qui suit:

new_contact_event_path(contact, email) 

Cela prendrait l'exemple du modèle de contact et du modèle e-mail.

A l'intérieur, j'imagine la contact_event_controller aurait besoin de savoir ...

@contact_event.type = (params[:email]) # get the type based on what was passed in? 
    @contact_event.event_id = (params[:email]) #get the id for the correct class, in this case Email.id 

pas sûr comment cela fonctionne ....

Répondre

0

j'aurais un contrôleur (et peut-être vues) pour chacun de vos types de ressources. Donc, ajoutez un contrôleur pour ContactEmail un pour ContactLetter etc. Ne vous embêtez pas avec un pour la classe de base ContactEvent. Ensuite, vos chemins se lirait comme suit:

new_contact_email_path(@contact) or new_contact_letter_path(@contact) 

Les actions du contrôleur utiliseraient alors le modèle approprié pour ce qu'ils représentent, à savoir:

@contact_email = ContactEmail.new(params[...]) 

Si vous pouvez garder vos trois types de ressources distinctes plutôt que en essayant de transmettre le type et en construisant le bon objet dans un contrôleur, vous devriez trouver la vie beaucoup plus facile. L'inconvénient est que vous pouvez avoir besoin de plus de liens/formulaires/vues dans le front end, mais en fonction de votre application, cela peut ne pas être une mauvaise chose du point de vue de l'utilisateur.

+0

Comment pourrais-je réduire une partie de la redondance? La raison pour laquelle je vais dans ce sens est que seul un contrôleur a le code, en ce moment, j'ai beaucoup de duplication .... – Angela

+0

La plupart des contrôleurs RESTFUL de base ressemblent exactement aux mêmes petites différences. Le modèle utilisé, message flash, etc. Si vous avez identifié trois ressources similaires, chacune mérite le droit à sa propre existence même si elles sont très similaires. Vous pouvez utiliser un plugin tel que resources_controller si vous souhaitez réduire cette duplication (et les rails normaux). Du point de vue des vues, vous pouvez extraire tout ce qui est générique dans un partiel partagé. Vous pouvez transmettre le ou les objets qui doivent être uniques en fonction de leur provenance. – tsdbrown

+0

Hmm ... alors je suppose que je ne devrais même pas essayer de les consolider comme un héritage de table unique? – Angela