Polecam zainstalowanie plug-inu Attachment_fu
script/plugin install http://svn.techno-weenie.net/projects/plugins/attachment_fu
Następnie tworzymy model np. File /lub plik - tworząc odpowiednie inflections/, czyli
scrip/generate model Plik
w stworzona migracja powinna wyglądać następująco:
class CreatePliki < ActiveRecord::Migration
def self.up
create_table :pliki do |t|
t.column :filename, :string
t.column :size, :integer
t.column :content_type, :string
t.column :thumbnail, :string
t.column :parent_id, :integer
t.column :height, :integer
t.column :width, :integer
# Obsługa polimorfizmu
t.column :zasob_id, :integer
t.column :zasob_type, :string
t.timestamps
end
end
def self.down
drop_table :pliki
end
end
A nasz plik modelu powinien zawierać następujący wpis:
class Plik < ActiveRecord::Base
belongs_to :zasob, :polymorphic => true # Polimorfizm
has_attachment :content_type => :image,
:storage => :file_system,
:max_size => 2.megabytes,
:resize_to => '300x300>',
:size => 0..2.megabyte,
:thumbnails => {
:small => '50x50>',
:medium => '100x100>',
:big => '200x200>'
},
:processor => :MiniMagick;
validates_as_attachment
end
Zdefiniowane zostały tutaj opcje zapisu zdjęcia uwzględniające tworzenie miniaturek za pomocą biblioteki MiniMagic. Aby ją zainstalować powinniśmy wpisać w konsoli:
sudo gem install mini_magick
Teraz wiążemy nasze zdjęcie z jakąś istniejącą klasą modelu. W naszym przypadku niech będzie nią klasa produkt:
class Produkt < ActiveRecord::Base
has_and_belongs_to_many :kategorie
belongs_to :producent
has_one :plik, :as => :zasob #,:class_name => 'Plik'
validates_presence_of :nazwa, :message => "nie może być pusta"
validates_presence_of :cena, :message => "nie może być pusta"
validates_length_of :nazwa, :minimum=>2, :message=> "musi składać się przynajmniej z dwóch znaków"
validates_numericality_of :cena, :greater_than_or_equal_to => 0, :message => "nie może być ujemna"
end
W następnej kolejności musimy uzupełnić widoki o możliwość dodawania oraz wyświetlania naszego obrazka. W formularzu dla akcji new oraz edit powinniśmy mieć następujący wpis
<% form_for(@produkt, :html => { :multipart => true }) do |f| %>
....
<%= file_field :plik, :uploaded_data %>
....
<% end %>
Musimy również uzupełnić nasz kotroler o zapis załączonego pliku. W akcji update oraz create należy dodać następujący kod:
unless params[:plik].blank?
@produkt.plik = Plik.new(params[:plik])
p.save
end
Wyświetlić nasz załączony plik możemy w następujący sposób:
<%= image_tag(@produkt.plik.public_filename(:big)) if @produkt.plik%>
gdzie :big to nazwa thumbnailsa podana w modelu. Jeżeli nie podamy tego parametru wyświetlony będzie oryginalny obrazek.
Przedstawiłem podstawowe kroki niezbędne do dodania możliwości przechowywania plików związanych z naszymi klasami modelu. Po więcej informacji odsyłam do:
http://www.railslodge.com/plugins/108-attachment-fu
http://clarkware.com/cgi/blosxom/2007/02/24
http://blog.defv.be/2007/12/19/attachment_fu-with-polymorphic-association
http://khamsouk.souvanlasy.com/2007/5/1/ajax-file-uploads-in-rails-using-attachment_fu-and-responds_to_parent