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

时间:2012-01-26 10:28:00

标签: ruby-on-rails ruby ruby-on-rails-3.1 metaprogramming carrierwave

首先,我正在使用rails 3.1.3和来自master的carrierwave github回购的分支。

我使用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命令 使用我的'虚拟'属性。

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

最好的关注。多米尼克。

2 个答案:

答案 0 :(得分:6)

同样的问题,但在您的模型中解决,您应该覆盖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

答案 1 :(得分:3)

现在还有一个载波的附加组件,它提供了Antiarchitect所描述的确切功能:

https://github.com/timsly/carrierwave-serializable