【问题标题】:carrierwave: mount uploader on serialized dynamic attributecarrierwave:在序列化的动态属性上挂载上传器
【发布时间】:2012-02-19 11:10:38
【问题描述】:

首先,我使用的是 rails 3.1.3 和 master 的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 命令 使用我的“虚拟”属性。

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

最好的尊重。多米尼克。

【问题讨论】:

  • 这是一个非常本地化的问题,因此您最好向 CarrierWave 小组提问:groups.google.com/group/carrierwave
  • 感谢您的回复,但我已经尝试过了。遗憾的是没有答案。这就是我来这里的原因。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-23
      • 2023-03-13
      • 1970-01-01
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2014-03-20
      • 1970-01-01
      相关资源
      最近更新 更多