Paperclip - dynamiczna zmiana :styles

Oswobodzony z PHP po pięciu latach komercyjnej batalii nareszcie od tygodnia pomykam na wymarzonych Torach.
Powiem wam… Jest przezacnie!! :slight_smile:

Mam pierwszy problem. Bardzo liczę na Waszą pomoc.

Mam:

[code=ruby]class Original < ActiveRecord::Base
has_attached_file :photo, :styles => { :mini => “100x100#” }
has_many :versions
end

class Version < ActiveRecord::Base
has_attached_file :photo
belongs_to :original
end[/code]
Chcę zrobić upload fotki w oryginale a następnie z listy dostępnych rozmiarów miniaturek wybrać jeden i utworzyć jej wersję. Oryginał może mieć wiele wersji. Rozmiary wersji mogą się zmienić.

Nieudolnie próbowałem podmienić :styles instancji obiektu Version i odpalić metodę reprocess.

Domyślam się, że trzeba jakoś z Paperclip::Atachement pofiglować ale jakoś nie mam koncepcji.

Help koledzy!

Sprawdź http://github.com/markevans/dragonfly.
Chyba lepiej pasuje do Twoich potrzeb, bo wymiary podajesz dopiero w widoku, możesz więc podać cokolwiek, np:

<%= image_tag @version.photo.url(@version.geometry) %>

[code=ruby]class Version < ActiveRecord::Base
image_accessor :photo

def geometry
“#{width}x#{height}” # zakładam, że width i height są w modelu
end
end[/code]

Witaj,

Skoro w paperclipie używasz styles to masz zainstalowanego imagemagick’a. Zainstaluj gema rmagick i zrób to w nim.
http://www.imagemagick.org/RMagick/doc/image3.html#resize

Pozdrawiam

Wprawdzie nie do końca jestem pewny czy rozumiem pytanie :slight_smile:

ale może ten tutorial coś pomoże http://mdeering.com/posts/018-paperclip-processors-doing-so-much-more-with-your-attachment

Dziękuję Wam za pomoc! Problem rozwiązany.

@czak: dragonfly doskonały pomysł ale nie dla mnie bo przy tworzeniu niektóre wersje będą miały opcję przycięcia więc samym oryginałem tego nie rozwiążę.

@Artur79: dzięki za link, dzięki niemu trafiłem na stronkę z rozwiązaniem.

Jestem w domu. Tutaj szczegóły => Styles can be Procs too.

[color=red]To jest złe rozwiązanie (nie działa na produkcji patrz ostatni post):[/color][code=ruby]class Version < ActiveRecord::Base
has_attached_file :photo, :styles => { :custom => Proc.new
{ |instance| “#{instance.photo_width}x#{instance.photo_height}>” } }
belongs_to :original
before_save :reprocess_photo

def reprocess_photo
photo.reprocess!
end
end

a wiec po uploadzie robie tak

version.photo_width = 123
version.photo_height = 456
version.save!

VOILA! :)[/code]

Re-we-la-cja!

Właśnie znalazłem miejsce, gdzie z miłą chęcią wcisnę takie rozwiązanie, dzięki serdeczne.

Rozwiązanie z Proc.new stwarza problemy na produkcji bo jest nieodporne na cache’owanie.

W Version rozwiązałem to z użyciem RMagick’a:[code=ruby] before_update :crop_photo, :if => :cropping?
after_create :clone_photo, :if => :crop_auto?

def crop_photo
photo = Magick::ImageList.new(foto.photo.path(:original))
photo.crop!(crop_x.to_i, crop_y.to_i, crop_w.to_i, crop_h.to_i)
photo.resize!(resolution.width, resolution.height)
photo.write(crop_path)
end

def clone_photo
photo = Magick::ImageList.new(foto.photo.path(:big))
photo.resize_to_fit!(resolution.width, resolution.height)
white_bg = Magick::Image.new(resolution.width, resolution.height)
photo = white_bg.composite(photo, Magick::CenterGravity, Magick::OverCompositeOp)
photo.write(crop_path)
end

def crop_url
foto.photo.url(:big).gsub(/./,"_crop_v#{id}.")
end

def crop_path
foto.photo.path(:big).gsub(/./,"_crop_v#{id}.")
end[/code]