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