Einzelner Controller, mehrere (vererbte) Klassen (Rails 3)

8

Ich habe eine Basisklasse geerbt von zwei anderen über Single Table Inheritance. Ich möchte, dass alle Unterklassen aus verschiedenen Gründen dieselben Controller / Ansichten verwenden - der einzige wirkliche Unterschied liegt in der Funktionalität des Modells.

Wenn ich jedoch versuche, link_to "stuff", instance_of_child zu verwenden, bekomme ich Beschwerden darüber, dass ich die richtige Seite nicht finden kann.

Ich habe versucht, mit match / / subclass <= & gt; redirect ('/ parent') , aber das ergibt seltsame Links, die keinen Sinn ergeben. Irgendwelche Vorschläge? Ich bin ziemlich neu bei Rails, und ich gebe zu, dass mein Verständnis von routes.rb immer noch begrenzt ist - aber ich bin mir nicht ganz sicher, ob ich dort überhaupt hinschauen sollte.

    
user632657 24.02.2011, 16:21
quelle

1 Antwort

12

Von Ссылка :

  

Wenn Sie jemals versucht haben, STI zu einem hinzuzufügen   bestehende Rails-Anwendung Sie   wahrscheinlich wissen Sie, dass viele von Ihnen   link_to und form_for Methoden werfen   Fehler, wenn Sie eine Elternklasse hinzufügen.   Dies liegt daran, dass ActionPack betrachtet   die Klasse eines zu bestimmenden Objekts   sein Pfad und URL, und Sie haben nicht   Pfade für Ihre neuen Unterklassen.   Sie können die Routen jedoch so hinzufügen   Ich empfehle es nicht:

%Vor%
  

Dies lindert nur ein bestimmtes   Symptom. Wenn wir form_for verwenden, unser Formular   Felder werden immer noch nicht die Namen haben   wir erwarten (zB: params [: car] [: color]   statt params [: vehicle] [: color]).   Stattdessen sollten wir die Wurzel von   das Problem durch die Umsetzung der   model_name Methode in unserer Elternklasse.   Ich habe keine Dokumentation für gesehen   diese Technik, so ist das sehr   inoffiziell, aber es macht Sinn und es   Funktioniert perfekt für mich in Rails 2.3   und 3:

%Vor%
  

Das sieht wahrscheinlich verwirrend aus, also lass es   Ich erkläre:

     

Wenn Sie eine URL-generierende Methode aufrufen   (zB: link_to ("Auto", Auto)), ActionPack   ruft model_name für die Klasse von   gegebenes Objekt (hier Auto). Dies kehrt zurück   eine spezielle Art von String, der   bestimmt, wie das Objekt aufgerufen wird   in URLs. Alles, was wir hier machen, ist   Überschreiben der Methode model_name für   Unterklassen von Vehicle so ActionPack   sehen Auto, LKW und Motorrad   Unterklassen als zu dem Elternteil gehörend   Klasse (Fahrzeug), und verwenden Sie daher die   die benannten Routen der Elternklasse   (VehiclesController) wo auch immer URLs sind   erzeugt. Das alles geht davon aus, dass du es bist   Rails-Ressourcenstil verwenden (RESTful)   URLs. (Wenn Sie nicht sind, tun Sie bitte.)

     

Um den Modellnamen zu untersuchen   Rufen Sie sich selbst an, sehen Sie sich die Rails an   Quellcode für die   ActionController :: RecordIdentifier # Modellname_von_Record_oder_Class   Methode. In Rails 2.3 das Besondere   string ist eine Instanz von   ActiveSupport :: ModelName, in Rails 3   Es ist ein ActiveModel :: Name

    
Michelle Tilley 24.02.2011, 18:52
quelle