2015-02-17 5 views
11

Я пытаюсь добавить дополнительные поля в CarrierWave Uploader так, что они хранятся как часть самого Uploader и вместе с полями CarrierWave, такие как @file, @model, @storage и т.д.Дополнительные поля в CarrierWave Uploader

Поля также зависят от версии, поэтому я предпочел бы иметь к ним доступ через <my_model>.<my_uploader>.attribute и
<my_model>.<my_uploader>.versions[:<the_version>] вместо дополнительных столбцов в модели.

Я попробовал carrierwave-meta gem, но столкнулся с ним (NoMethodError: undefined method \'original_filename' for #<CarrierWave::Storage::Fog::File:0xab4134c>) , который, кажется, еще не исправлен.

Любые идеи или предложения о том, как наилучшим образом выполнить это?

ответ

3

Я не на 100% понимаю, что вы пытаетесь сделать.

Когда я использую драгоценный камень несущей, я создаю путь, который содержит некоторую часть этой информации. В моих applaications я обычно есть файл приложение/закачивающие/image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base 
    include CarrierWave::RMagick 
    def store_dir 
     # "uploads/image/file/187/" 
     "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
    ... 
    end 

из этого я всегда знаю модель, какой тип файла и идентификатор. Вся другая информация об этой модели Обычно я сохраняю в базе данных.

Я надеюсь, что это помогает и устанавливает вас в правильном направлении

1

ваша ошибка связана с туманом

В моих Picture Uploader я могу установить читателя атрибутов и писатель

class PictureUploader < CarrierWave::Uploader::Base 
    include CarrierWave::MiniMagick 
    storage :file 

    def field 
    @field 
    end 

    def field=(field) 
    @field = field 
    end  

    # attr_accessor :field # for an even shorter way 
end 

двутавровых открыть rails console для испытания модели:

picture = PictureUploader.new 
=> #<PictureUploader:0x0055804db336e8 @model=nil, @mounted_as=nil> 

picture.field=('your text') 
=> "your text" 

picture.field 
"your text" 

О версионности и ошибок вы имеете 'NoMethodError: undefined method \'original_filename' for #<CarrierWave::Storage::Fog::File:0xab4134c>' Я согласен с MZaragoza

CarrierWave::Storage::Fog::File.new принимает три параметра

def store!(file) 
    f = CarrierWave::Storage::Fog::File.new(uploader, self, uploader.store_path) 
    f.store(file) 
    f 
    end 

uploader, self и uploader.store_path так, чтобы помочь нам решить эту проблему, вы должны включать CarrierwaveUploader код модели и тому выход uploader.store_path

Большое спасибо

Смежные вопросы