ruby-on-rails - 如何在插件的 before_save 回调中包含实例方法?

标签 ruby-on-rails ruby activerecord plugins callback

我正在创建一个插件,但很难定义调用我刚刚定义的实例方法的 before_save 过滤器。这是一个快速示例:

module ValidatesAndFormatsPhones
  def self.included(base)
    base.send :extend, ClassMethods
  end

  module ClassMethods

    def validates_and_formats_phones(field_names = [:phone])
      send :include, InstanceMethods

      # the following variations on calls to :format_phone_fields fail

      before_save send(:format_phone_fields, field_names)

      before_save format_phone_fields(field_names)

      before_save lambda { send(:format_phone_fields, field_names) }

      # EACH OF THE ABOVE RETURNS 'undefined_method :format_phone_fields'
    end
  end

  module InstanceMethods

    def format_phone_fields(fields = [:phone], *args)
      do stuff...
    end

  end
end

ActiveRecord::Base.send :include, ValidatesAndFormatsPhones

我想问题是,如何将上下文更改为实例而不是类?

我更愿意调用实例方法,因为该类实际上不应该有一个名为“format_phone_fields”的方法,但实例应该有。

谢谢!

最佳答案

在正确的时刻包含您的方法:当您扩展基类时:

module ValidatesAndFormatsPhones
  def self.included(base)
    base.send :extend, ClassMethods
    base.send :include, InstanceMethods
  end

  module ClassMethods
    def validates_and_formats_phones(field_names = [:phone])
      before_save {|r| r.format_phone_fields(field_names)}
    end
  end

  module InstanceMethods
    def format_phone_fields(fields = [:phone], *args)
      # do stuff...
    end
  end
end

ActiveRecord::Base.send :include, ValidatesAndFormatsPhones

我还没有运行代码,但它应该可以工作。我经常做类似的事情。

关于ruby-on-rails - 如何在插件的 before_save 回调中包含实例方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2164773/

相关文章:

ruby-on-rails - 如何 DRY 前端/后端常量

ruby - 如何格式化logstash中的数字?

mysql - Rails Active Record 查询计数多个关系

ruby-on-rails - Rails 自定义 ActiveRecord::Type 在 has_many 中使用 `class_name` 时失败:通过关联

ruby-on-rails - Ruby 邮件程序出现 EOFError

ruby-on-rails - 带有 rspec 的 rails json.jbuilder api -> ActionView::MissingTemplate

ruby - 在 Ruby 中将一个文件中的属性替换为另一个文件中的属性

ruby - 算法的大O复杂度

ruby-on-rails - Rails 3.1 限制用户创建的对象

mysql - 优化 Rails 4/ActiveRecord/MySQL 中的删除操作