carrierwave: монтировать загрузчик на сериализованный динамический атрибут - PullRequest
5 голосов
/ 26 января 2012

Прежде всего, я использую рельсы 3.1.3 и carrierwave из главной ветки github repo.

Я использую ловушку after_init для определения полей на основе атрибута экземпляра модели страницы и определения атрибутов доступа для этих полей, которые хранят значения в сериализованном хэше (надеюсь, понятно, о чем я говорю).Вот урезанная версия того, что я делаю:

class Page < ActiveRecord::Base 
  serialize :fields, Hash 

  after_initialize :set_accessors 

  def set_accessors 
    case self.template 
      when 'standard' 
        class << self 
            define_method 'image' do 
              self.fields['image'] 
            end 
            define_method 'image=' do |value| 
              self.fields['image'] = value 
            end 
          end 
          mount_uploader :image,   PageImageUploader 
        end 
    end 
  end 
end 

, пропуская команду mount_uploader, дает мне доступ к атрибуту, как я хочу.но когда я монтирую загрузчик, я получаю сообщение об ошибке: «неопределенный метод, новый для класса nil»

Я читаю в источнике, что в модуле расширений есть методы read_uploader и write_uploader.Как мне переопределить их, чтобы заставить команду mount_uploader работать с моим «виртуальным» атрибутом.

Надеюсь, у кого-то есть идея, как мне решить эту проблему.большое спасибо за вашу помощь.

С наилучшими пожеланиями.Dominik.

Ответы [ 2 ]

7 голосов
/ 17 апреля 2012

Та же проблема, но решенная в вашей модели, вы должны переопределить read_uploader(column) и write_uploader(column, identifier) методы экземпляра.У меня также есть проблема с #{column}_will_change! и #{column}_changed? для виртуального столбца, поэтому мне пришлось определить их тоже:

class A < ActiveRecord::Base
  serialize :meta, Hash

  mount_uploader :image, ImageUploader

  def image_will_change!
    meta_will_change!
    @image_changed = true
  end

  def image_changed?
    @image_changed
  end

  def write_uploader(column, identifier)
    self.meta[column.to_s] = identifier
  end

  def read_uploader(column)
    self.meta[column.to_s]
  end
end
4 голосов
/ 19 февраля 2013

Теперь есть также дополнение к carrierwave, которое обеспечивает точную функциональность, как описано в Antiarchitect:

...