我想改变 Gem 的行为,需要重写 Gem 的一个方法,重写的方法需要用到原来的实现,改变其中的一部分。
Gem 的代码
module CarrierWave
module Mongoid
include CarrierWave::Mount
def mount_uploader(column, uploader=nil, options={}, &block)
field options[:mount_on] || column
super
...
class_eval <<-RUBY, __FILE__, __LINE__+1
# 我要重写的方法,
def #{column}=(new_file)
column = _mounter(:#{column}).serialization_column
# mongoid won't upload a new file if there was no file previously.
write_uploader(column, '_old_') if self.persisted? && read_uploader(column).nil?
send(:"\#{column}_will_change!")
super
end
... 很多其他的方法,维持不变
RUBY
end
end # Mongoid
end # CarrierWave
我写的代码
module CarrierWave
module MongoidExtensions
def mount_uploader(column, uploader=nil, options={}, &block)
super
puts "New mount_uploader"
class_eval <<-RUBY, __FILE__, __LINE__+1
def #{column}=(cache_name)
puts "重写了"
end
RUBY
end
end
module Mongoid
prepend MongoidExtensions
end
end
但我的代码看起来没起作用,给我的感觉是 prepend 的 mount_uploader 完全没有生效,因为 puts "New mount_uploader" 都没有出来。 请问应该怎么搞? 谢啦先!