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