Umgang mit Images in RefineryCMS Nachtrag
There was a time, when I shared a blog. This post was written by Stephan. See all blogpost from him or stalk him on github.
RefineryCMS in der Rails 3 Version lieferte einige Änderungen betreffend des Umgangs mit Bildern und Dateien. Es wurde nun auf die Verwendung von Dragonfly gesetzt, die als Rack Middleware in der Railsanwendungen betrieben wird.
Folgend eine kleine Gedankenstütze für die Verwendung in den Active Record Models, um Verbindungen mit den neuen Image und Resource Plugins zu erreichen:
Refinery Engine benutzt eine Bilddatei: z.B: eine Galerie hat ein Titelbild
Model:
class Gallery < ActiveRecord::Base
belongs_to :image
#Galerie-Migration muss eine Spalte image_id (Rubykonvention) besitzen oder kann mit :foreign_key => :eigener_name angepasst werden
#belongs_to image, :foreign_key => :title_image
end
View:
<%= form_for([:admin, @gallery]) do |f| %>
#andere Modelattribute z.B. Titel
<div class='field'>
<%= f.label :image_id -%>
<%= render :partial => "/shared/admin/image_picker", :locals => {
:f => f,
:field => :image_id,
:image => @gallery.image,
:toggle_image_display => false
} %>
#image_picker speichert die id des ausgewählten Bildes im Feld image_id
</div>
<% end %>
Refinery Engine benutzt mehrere Bilddateien: z.B: ein Projekt hat ein Titelbild und ein Statusbild
Model:
class Project < ActiveRecord::Base
belongs_to :title_image, :class_name => "Image"
belongs_to :status_image, :class_name => "Image"
#Projekt-Migration muss die Spalten title_image_id und status_image_id (Rubykonvention) besitzen oder kann mit :foreign_key => :eigener_name angepasst werden siehe Beispiel zuvor
end
View:
<%= form_for([:admin, @project]) do |f| %>
#andere Modelattribute z.B. Titel
<div class='field'>
<%= f.label :title_image_id -%>
<%= render :partial => "/shared/admin/image_picker", :locals => {
:f => f,
:field => :title_image_id,
:image => @project.title_image,
:toggle_image_display => false
} %>
# image_picker speichert die id des ausgewählten Titelbildes im Feld title_image_id
</div>
<div class='field'>
<%= f.label :status_image_id -%>
<%= render :partial => "/shared/admin/image_picker", :locals => {
:f => f,
:field => :status_image_id,
:image => @project.status_image,
:toggle_image_display => false
} %>
# image_picker speichert die id des ausgewählten Statusbildes im Feld status_image_id
</div>
<% end %>
Will man eine Galerie mit vielen Bildern abbilden, muss man eine has_many Relation erzeugen
Model:
#gallery.rb
class Gallery < ActiveRecord::Base
#Verknüpfungstabelle zur Join-Tabelle
has_many :galleryitems, :dependent => :destroy, :order => "galleryitems.position ASC"
#Verknüpfungstabelle zur Image Engine von RefineryCMS
has_many :images :through => :galleryitems
end
#galleryitem.rb
class Galleryitem < ActiveRecord::Base
belongs_to :image
belongs_to :gallery
#Galleryitem-Migration muss die Spalten image_id und gallery_id (Rubykonvention) besitzen oder kann mit :foreign_key => :eigener_name angepasst werden
end
Generell finde ich die gesamte Logik, die Bilder- und Datei-Uploads in RefineryCMS in einer Datenbank abzuspeichern nicht sehr komfortabel. Es führt zu Problemen bei Änderung von Dateinamen und lässt das Hochladen von Bildern zu einer sehr langwierigen Angelegenheit werden (Refinery 0.9.9 wird bereits HTML5 Multiupload ermöglichen). Ich muss noch einige Recherchen beenden (Rails Metal, Rack und vor allem Dragonfly) und vielleicht kann ich bald ein neues Filebrowser-Plugin für RefineryCMS vorstellen, bei dem ich mich konzeptionell an den Filebrowser von Typo3 orientiert habe.
Ich will nicht zu viel versprechen, aber demnächst mehr von mir
Gruß skeller1