W którymś ze swoich projektów potrzebowałem aby obrazki gromadzone przez użytkowników aplikacji gromadzone były w katalogach firm, do których należą owi użytkownicy. Oczywiście w parametrze "
path
" Paperclip'a nie występuje nic podobnego do "
firm_id
".
Innymi słowy chciałem zapisać coś takiego:
has_attached_file :scan_picture, :styles => {:thumb => '50x50>'},
:default_url => '/images/:style/missing.png',
:url => "/system/scan_pictures/:firm_id/:id/:style/:basename.:extension",
:path => ":rails_root/public/system/scan_pictures/:firm_id/:id/:style/:basename.:extension"
Jest to jednak możliwe :-)
Zrobiłem tak:
w katalogu
/config/initializers
stworzyłem plik
paperclip_interpolations.rb
w tym pliku umieściłem zapis:
Paperclip.interpolates('firm_id') do |attachment, style|
attachment.instance.move_out.customer.firm_id.to_s.parameterize
end
Tłumaczyć to można tak:
Weź egzemplarz klasy, która wywołuje dołączanie pliku (
attachment.instance
), pobierz z niego obiekt wyjazd (
move_out
), a z niego klienta i firmę, do której klient należy. Przekształć
firm_id
na string i użyj metody
prametrize
.
No i aby powyższe lepiej zrozumieć można przytoczyć jeszcze specyfikację
MoveOut
(wyjazd):
class MoveOut < ActiveRecord::Base
belongs_to :customer
end