carrierwave:在序列化动态属性上安装上传器

dom*_*tra 5 ruby metaprogramming ruby-on-rails carrierwave ruby-on-rails-3.1

首先,我使用的是来自github repo主分支的rails 3.1.3和carrierwave.

我使用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 
Run Code Online (Sandbox Code Playgroud)

省略mount_uploader命令可以让我访问我想要的属性.但是,当我挂载上传器时,会收到一条错误消息,提示"未定义的方法是新的nil类"

我在源代码中读到扩展模块中有read_uploader和write_uploader方法.我如何重写这些以使mount_uploader命令与我的'virtual'属性一起工作.

我希望有人知道如何解决这个问题.非常感谢你的帮助.

最良好的问候.多米尼克.

Ant*_*ect 7

同样的问题,但在你的模型中解决,你应该覆盖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
Run Code Online (Sandbox Code Playgroud)