Sonntag, 15. November 2009

Rails-Plugin Paperclip

Folgendes Problem:

Ich programmiere in Rails eine Homepage und will in einem Bereich Hörproben oder andere Downloads zur Verfügung stellen. Diese sollen nicht im Filesystem, sondern in der Datenbank gespeichert werden.

Hierzu verwende ich nun einen Zweig des Plugins Paperclip, zu finden hier. (Im Prinzip kann amn dort auch nachlesen, was nun hier steht)

Meine Vorgehensweise war dabei wie folgt ([name] dabei immer durch den gewünschten Namen ersetzen, also inkluseive der eckicken Klammern)

  1. plugin installieren

    script/plugin install git://github.com/patshaughnessy/paperclip.git

  2. der tabelle des models folgende spalten hinzufügen:

    [name]_file :binary
    [name]_file_name :string
    [name]_file_size :integer
    [name]_content_type :string

  3. in app/model/model.rb folgende zeilen einfügen: (mein Model in diesem bsp heißt "Model")

    has_attached_file :[name], :storage => :database
    default_scope select_without_file_columns_for(:[name])

  4. im view zum anlgegen muss der "form_for"-Bereich mit mutipart erweitert werden:

    <% form_for(@model, :html => { :multipart => true }) do |f| %>

  5. Nun kann man das ganze mit einem file_field hochladen:

    <p>
    <%= f.label :name %><br />
    <%= f.file_field :name %>
    </p>

  6. Im controller des models das dazumengen:

    downloads_files_for :[modelname], :[name]

  7. Erreichbar sind die dateien jetzt unter

    /:relative_root/:class/:attachment/:id?style=:style


    In meinem Fall also

    http://url/models/names/:id


Zu beachten: beim Download sind es die Plurale! also mit angehangenem "s"

Bei mir kam noch hinzu, dass nur eingeloggte Benutzer die Dateien downloaden durften. Mein Filter in der Model-Datei also:

before_filter :check_logged_in, :only => :[name]s
(Wieder mit Plural!!!)

Vielen Dank an Pat Shaughnessy

Keine Kommentare: