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.
Von Ссылка :
%Vor%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:
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
Tags und Links ruby-on-rails-3 controller single-table-inheritance