CarrierWave refactor

cześć,
pierwszy raz mam do czynienia z Carrierwave lub paperclipem.

Co chciałem osiągnąć:

  • użytkownik może dodać trzy obrazki
  • każdy z obrazków ma trzy wersje small medium large
  • obrazki zachowują się w folderze public/id_ogłoszenia/1_large.png , 1_medium.png, 1_small.png, 2_large …
  • nie mam doświadczenia jak powienienem zapisać nazwę pliku w bazie danych: jako pełna ścieżka do pliku? narazie jest to file: _original.png

Czy jest możliwe aby zamiast model.id wstawić dla każdego następnego pliku kolejny numer?

Narazie udało mi się tylko osiągnąć coś takiego:

[code=ruby]# GEMY: carrierwave, nested_form

file_uploader.rb

class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :file

def store_dir
“photos/#{model.attachable_id}”
end

process :resize_to_limit => [500, 500]
process :convert => ‘png’

version :medium do
process :resize_to_limit => [250, 250]
process :convert => ‘png’
def full_filename (for_file = model.file)
“thumb_#{model.id}_medium.png”
end
end

version :small do
process :resize_to_limit => [50, 50]
process :convert => ‘png’
def full_filename (for_file = model.file)
“thumb_#{model.id}_small.png”
end
end

def filename
“#{model.id}_original.png” if original_filename #nie odkryłem jeszcze dlaczego w tym przypadku do bazy nie zostaje zapisany model.id
end
end

new.haml

= f.fields_for :photos do |photo_form|
  = photo_form.label :file
  %br/
  = photo_form.file_field :file
  = photo_form.link_to_remove "Remove this attachment"
= f.link_to_add "Add photo", :photos

show.haml

#title
%h1
= @ad.title
#ad_content
%b Treść ogłoszenia:
= @ad.ad_content
%br

  • if @ad.photos.present?
    • @ad.photos.each do |p|
      #photos
      = image_tag("…/…/photos/#{@ad.id}/thumb_#{p.id}_small.png")[/code]
      Jak żyć z tym kodem panie Premierze??

Uploader:

[code=ruby]class FileUploader < CarrierWave::Uploader::Base
include CarrierWave::RMagick
storage :file

def store_dir
“public/uploads/photos/#{model.ad_id}”
end

process :resize_to_limit => [500, 500]
process :convert => ‘png’

version :medium do
process :resize_to_limit => [250, 250]
process :convert => ‘png’
end

version :small do
process :resize_to_limit => [50, 50]
process :convert => ‘png’
end

def full_filename(for_file = model.file)
version_name = self.version_name || ‘large’
“#{model.id}_#{version_name}.png”
end
end[/code]
Widok:

[code=haml]%br

  • if @ad.photos.any?
    #photos
    • @ad.photos.each do |p|
      = image_tag p.file.small.url[/code]
  • nie mam doświadczenia jak powienienem zapisać nazwę pliku w bazie danych: jako pełna ścieżka do pliku? narazie jest to file: _original.png
    to jest nazwa oryginalnego pliku, raczej nie ma znaczenia.