Usando o carregador Carrierwave para modelo tableless no Rails

Repostagem do meu blog , quero compartilhar minha experiência na implementação do Carrierwave para o modelo tableless, por exemplo, eu tenho o usuário do modelo:

class User
attr_accessor
:id, :name, :avatar
...
end

Eu preciso armazenar o avatar do usuário usando o carrierwave, neste caso eu crio o AvatarUploader , o problema é como eu armazeno o avatar da instanciação do modelo do usuário? Se sua classe é uma subclasse de ActiveRecord :: Base, você pode usar o método mount_uploader
, mas se você tiver um modelo como User que não é uma subclasse de ActiveRecord :: Base, você obterá a exceção:

undefined method `mount_uploader' for User:Class

Com base na documentação do carrierwave, você pode usar o mount_uploader se sua classe estender o módulo CarrierWave :: Mount e sua classe tiver a capacidade de armazenar um arquivo usando o método de instância store_(mounted_field)!ou cache_(mounted_field)!. Então, vamos refatorar nosso modelo de usuário:

class User
extend
CarrierWave::Mount
attr_accessor
:id, :name, :avatar
mount_uploader
:avatar, AvatarUploader
...
def save
self.store_avatar!
end
...
end

E você pode testar no console do Rails:

u = User.new(id:1, name:"swagger")
u
.avatar = File.open(some_avatar_image_file_path)
u
.save

do console do rails, uma versão do avatar será criada em public / tmp / timestamp / quando você atribuir o arquivo de imagem ao campo avatar, quando o método save for executado ele será movido parapublic/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}

Ref:
http://minified.me/2013/06/28/using-carrierwave-uploader-for-tableless-model-in-ruby-on-rails