Rails - 如何覆盖Class内部的方法

时间:2013-11-14 09:24:46

标签: ruby-on-rails ruby-on-rails-3 activerecord override

我想在marshal覆盖 ActiveRecord方法,但不确定如何处理类内部模块内的方法

module ActiveRecord
 class SessionStore < ActionDispatch::Session::AbstractStore
   module ClassMethods
      def marshal(data)
        ::Base64.encode64(Marshal.dump(data)) if data
      end
   end
 end
end

我在config/initializers/active_record.rb

上试过这个
ActiveRecord::SessionStore.class_eval do
 ClassMethods.module_eval do
   def marshal(data)
      # Code
   end
 end
end

但它会抛出错误

config/initializers/active_record.rb:2:in `block in <top (required)>': uninitialized constant ClassMethods (NameError)

修改

我试图覆盖config/initializers/active_record.rb,不想编辑gem文件

2 个答案:

答案 0 :(得分:2)

您可以使用以下方式更简单地完成此操作:

ActiveRecord::SessionStore::ClassMethods.module_eval do
  def marshal(data)
    // code
  end
end

甚至更简单

module ActiveRecord::SessionStore::ClassMethods
  def marshal(data)
    // code
  end
end

答案 1 :(得分:0)

您是否尝试过重新定义?

module ActiveRecord
  class SessionStore
    module ClassMethods
      def marshal(data)
        # Code
      end
    end
  end
end