猴子修补和回调错误

时间:2015-05-29 09:25:15

标签: ruby-on-rails monkeypatching

我在Rails 4应用程序中使用了两个宝石:acts_as_tenantsimple_hashtags

如果一个租户上存在主题标签,则不会为其他租户重新保存。所以我想覆盖find_or_create_by_name和find_by_name方法 为此,我还需要覆盖parsed_hashtags method,但为了让我的应用程序使用它,我还需要包含回调

before_save :update_hashtags

我有一个initializer我第一次使用多租户系统来处理主题标签(因此tenant_id会自动保存)。我添加了这些方法,但是当我试图覆盖回调时,我碰到了一堵墙。

如果我在gist中使用扩展ActiveSupport :: Concern,我会收到此错误并且无法启动我的应用。

lib/active_support/concern.rb:126:in `included': Cannot define multiple 'included' blocks for a Concern (ActiveSupport::Concern::MultipleIncludedBlocks)
        from /Users/schatteleyn/subarashi/config/initializers/hashtags.rb:16:in `<module:Hashtaggable>'
        from /Users/schatteleyn/subarashi/config/initializers/hashtags.rb:14:in `<module:SimpleHashtag>'
        from /Users/schatteleyn/subarashi/config/initializers/hashtags.rb:1:in `<top (required)>'

如果我使用

版本
def self.included(base)
  base.class_eval do
    before_save :do_something
  end
end

我收到此错误,可以启动我的应用,但在任何页面上都会收到错误。

undefined method `before_save' for HashtagConcern:Module

我感到茫然,这是我能找到的唯一两种解决方案,而我似乎无法让它们发挥作用。 有没有其他方法可以在模块中使用回调?或者可能是另一种解决名称和租户寻找问题的方法?

1 个答案:

答案 0 :(得分:1)

为了让simple_hashtag能够识别租户,只需覆盖Hashtag模型的验证,例如:

SimpleHashtag::Hashtag.clear_validators!
module SimpleHashtag
  class Hashtag < ActiveRecord::Base
    acts_as_tenant :tenant
    validates :name, :uniqueness => { :scope => :tenant }
  end
end