2010-08-06 12 views
8

Ich bin auf der Suche nach wie andere in der Regel ihre Teiltöne für eine polymorphe Ressource organisieren.Organisieren von Teiltönen für eine polymorphe Ressource

Beispiel:

Ich habe Image die polymorph ist und je nachdem, was imageable ist, möchte ich die Dinge etwas anders angezeigt werden soll.

Ich habe eine teilweise images/_image und kann render imageable.images aufrufen. Meine derzeitige Denkweise ist es, mein Bild teilweise überprüfen zu lassen, welcher Typ imageable ist und dann noch einen Teil zu haben, der für diesen Fall spezifisch ist. Meine Organisation würde etwas entlang der Linien der folgenden sein:

images/ 
    _image.html.haml 
    _product.html.haml 
    _post.html.haml 
    _user.html.haml 

Mein _image teilweise etwas aussehen würde:

%div 
    = render :partial => "images/#{imageable.type}" 

Ist dies scheint wie ein schlechter Ansatz, oder flach aus dem falschen Ansatz? Ich denke, es wäre viel schöner, einfach render imageable.images von überall her anzurufen als render :partial => ... überall anrufen zu müssen.

Alle Ideen würden sehr geschätzt werden. Wie hast du es gemacht?

EDIT: Eine lange Zeit ist vergangen und ich frage mich immer noch, ob jemand irgendeinen Beitrag dazu hat. Ein Kopfgeld werfen, um zu sehen, ob das Aufmerksamkeit erregt.

Antwort

1

Ich bin ein bisschen unter dem Wetter, also kann ich es nicht testen. Aber Sie sollten einfach <%= render imageable.images %> eingeben und sehen, was es sagt. Es sollte funktionieren, weil es .modelname oder .class verwenden sollte :) Wenn es nicht funktioniert, würde ich tun, was Sie tun, wie oben erwähnt. Wenn es aber nicht klappt, kommet bitte mit was es sagt, denn dann werde ich wohl einen Patch auf den Rails-Core machen, der eigentlich so funktionieren sollte.

+0

Hallo Mohammad, danke für die Antwort. Wohl sollte ich meine Frage mit subjektiv (was meine Kopfgeld ein wenig peinlich machen könnte) markieren. Aber, ja, wie Sie gesagt haben, es funktioniert definitiv. Meine Frage ist subjektiver in dem Sinne, wie Menschen mit diesen Dingen umgehen. Die Art, wie ich diese Dateien organisiere, scheint mir immer "schmutzig" zu sein und suchte nach ein wenig mehr Einblick in die Art und Weise, wie andere Leute das tun. Prost. – theIV

+0

Ich würde es tun '<% = rendern ressource%>' es ist sauberer imo. Während ich vielleicht nicht weiß, dass es ein polymorphes Teilrecht der Fledermaus sein wird, ist es nicht so schwer herauszufinden, da sie alle da sind und im schlimmsten Fall nur einen Kommentar über der Linie oder etwas hinzufügen :) –

1

Ich rechne damit, Ihre ursprüngliche Idee auf dem richtigen Weg ist, mit einer geringfügigen Anpassung:

= render imageable.images 

# images/_image.html.haml 
= render image.imageable_type.underscore, :object => image.imageable, :image => image 

# images/_product.html.haml 
// Custom code for product image (with product and image local variables) 
2

In Ihrem Code unklar, es ist jetzt, dass _product tatsächlich ein _image ist.

denke ich, die Absicht in Rails ist es wie dies zu tun:

shared/ 
    _image.html.haml 
    imageable/ 
     _product.html.haml 
     _post.html.haml 
     _user.html.haml 

Dann in der _image Teil Sie rufen:

render :partial => imageable/#{image.type}", :image => image

Jetzt ist es aus der Verzeichnisstruktur klar, was Ihr Polymorphismus ist.

(Anmerkung: Ich benutze das shared Verzeichnis, aber natürlich, wenn Ihr Bild Teil ist eigentlich nicht zwischen den Ansichten geteilt sollte es in irgendeiner Ansicht Verzeichnis sein wie wenn Sie tatsächlich ein images_controller das Verzeichnis sollte images genannt werden)

2

Ich denke, Sie haben den richtigen Ansatz, aber ich denke, der letzte Schritt für die Sauberkeit ist es, die Bilder teilweise zu beseitigen, die ein anderes Teil auswählt, indem Sie stattdessen dieses Verhalten an einen Helfer übergeben. etwas wie...

module ImagesHelper 
    def show_image(imageable) 
    render :partial => "images/#{imageable.class.to_s.tableize}" 
    end 
end 

?