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'属性一起工作.
我希望有人知道如何解决这个问题.非常感谢你的帮助.
最良好的问候.多米尼克.
同样的问题,但在你的模型中解决,你应该覆盖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)
| 归档时间: |
|
| 查看次数: |
3492 次 |
| 最近记录: |