Почему я не могу отредактировать это изображение в Carrierwave?


У меня есть две монголоидные модели, магазин и продукт. Их связь заключается в том, что магазин имеет множество продуктов, а продукты принадлежат магазину. Каждая из этих моделей имеет несколько изображений, которые могут быть прикреплены с помощью Carrierwave, которые выглядят следующим образом:

mount_uploader :logo, ImageUploader

Я могу добавлять и редактировать изображения, которые находятся в модели магазина. Но в Product я могу добавить изображение только при создании продукта, но не при редактировании продукта. Это, кажется, каким-то образом является проблемой deep_copy, подобно тому, как в Mongoid, если у вас есть массив называется urls, и вы хотите обновить этот массив, вы должны вызвать

urls_will_change!

Поэтому я попытался вызвать эквивалентный метод (logo_will_change!) внутри обратного вызова before_update, но он ничего не делает. Есть ли где-то еще, где я должен делать это, или это еще одна проблема?

1 2

1 ответ:

Приведенный ниже код работал на меня, так что, возможно, происходит что-то еще:

# store model
class Store
  include Mongoid::Document
  mount_uploader :image, ImageUploader
  has_many :products
  field :name, type: String
end

# product model
class Product
  include Mongoid::Document
  mount_uploader :image, ImageUploader
  belongs_to :store
  field :name, type: String  
end

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

# some test data
@store = Store.new({:name => "store"})
@product = Product.new({:name => "product"})
@store.save
@store.products << @product

# later get the product and update the image
@product = Product.first
puts @product.image.url # blank
@product.update_attributes({:image => File.open("/path/to/image.png")})
puts @product.image.url # now has image url